gpt4 book ai didi

c++ - 子 vector 修改原始 vector

转载 作者:太空狗 更新时间:2023-10-29 20:38:53 27 4
gpt4 key购买 nike

我想提取一个子 vector 。然后修改影响原始 vector 的元素。我的示例代码如下:

#include <vector>
#include <iostream>

using namespace std;

void printvec(vector<int>& v){
for(int i = 0;i < v.size();i++) {cout << v[i] << " ";}
cout << endl;
}

int main(){
vector<int> original;
for(int i = 1;i <= 10;i++) original.push_back(i);
printvec(original);

vector<int> subvector(original.begin()+4, original.end()-2);
subvector[0]=0;
subvector[1]=0;
printvec(subvector);
printvec(original);
return 0;
}

在上面的代码中,subvector 不修改 vector。有人可以指出一种优雅的方法来制作修改原始 vector 的子 vector (希望尽可能不显式使用指针)。

最佳答案

如果您不想使用指针,您可以创建一个 slice 类来将工作转发给 - 它只是一对迭代器和您可能需要的任何其他操作:

template <typename T>
class slice {
using iterator = typename T::iterator;
using reference = typename std::iterator_traits<iterator>::reference;

slice(iterator first, iterator last)
: first(first), last(last)
{ }

reference operator[](size_t idx)
{
return *std::next(first, idx);
}

iterator begin() const { return first; }
iterator end() const { return last; }

private:
iterator first, last;
};

这样,您就可以进行切片了:

    slice<vector<int>> subvector(original.begin()+4, original.end()-2);
subvector[0]=0; // changes original[4]
subvector[1]=0; // changes original[5]

如果您将 printvec 更改为采用任意容器并使用 range-for 对其进行迭代,您也可以打印 subvector。它将包含:

0 0 7 8 

关于c++ - 子 vector 修改原始 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29953690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com