C++ 子向量修改原始向量

C++ 子向量修改原始向量,c++,vector,stl,C++,Vector,Stl,我想提取一个子向量。然后修改影响原始向量的元素。我的示例代码如下: #include <vector> #include <iostream> using namespace std; void printvec(vector<int>& v){ for(int i = 0;i < v.size();i++) {cout << v[i] << " ";} cout << en

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

#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;
}
#包括
#包括
使用名称空间std;
无效打印向量(向量和v){
对于(inti=0;i
vector<int> subvector(original.begin()+4, original.end()-2);

如果不想使用指针,可以创建一个
切片
类将工作转发到该类,该类将只是一对迭代器和可能需要的任何其他操作:

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;
};

int*subvector=original.begin()+4;
会起作用,尽管它肯定使用了指针。@dasblinkenlight:这也不会给你一个
size()
函数;)
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]
0 0 7 8