如何在c ++中将一个向量的一部分复制到另一个向量

时间:2016-05-26 12:32:13

标签: c++ vector iterator range

我有一个matirx sotred在行主要顺序的向量。例如:

1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16

我有一个功能

void transformatrix( vector<uint32> *vector_a)

对矩阵执行一些修改。我需要将一部分向量传递给该函数。例如,我需要传递

2 6 10 14

我正在考虑的是创建一个向量的副本,将其传递给函数:

vector<int> v2(v.begin() + x, v.begin() + x + y);

但是最好创建另一个向量,它只是一个指向原始向量的指针,因为我总是按顺序访问元素。

有没有办法在没有复制数据的情况下创建另一个向量?

2 个答案:

答案 0 :(得分:2)

这样的事情会有所帮助:

template <typename T> void your_function(T it_beg,T it_end){
    //do what ever you want
}

int main(){
    std::vector<int> v{1,1,1,1,1,1,1,1,1,1};
    your_function(v.begin()+x,v.begin()+x+y);
}

用例:

//Multiply all element by 2
template <typename T> void your_function(T it_beg,T it_end){
    for(auto it=it_beg;it!=it_end;++it){
        *it*=2;
    }
}

修改

OP提供了这个delcartion:

void transformatrix( vector<uint32> *vector_a)

解决问题的唯一方法是在不复制的情况下发送矢量,如下所示:

注意:这是一个可怕的想法。 使用它。它不是线程安全的。这很糟糕,任何评论你的代码的人都会讨厌你想象的更多。

int main(){
    std::vector<int> v{1,1,1,1,1,1,1,1,1,1};
    v.emplace_back(x);
    v.emplace_back(y);
    transformatrix(&v);
    v.pop_back();
    v.pop_back();
}

内部transformatrix

void transformatrix( vector<uint32> *vector_a){
    auto beg_index=vector_a[vector_a.size()-2];
    auto end_index=vector_a[vector_a.size()-2]+vector_a[vector_a.size()-1];
    //Your original code here with respect that you indexes now from beg_index->end_index
}

同样,这是破解的解决方案,但它是关于约束的唯一方法。请注意,这对x64平台不起作用,因为数据类型为32,我也使用它进行索引。因此,您只能受益于64位平台上的32位索引

答案 1 :(得分:1)

您可以拥有包含这些位置的迭代器(可能会失效)。

vector<int>::const_iterator start = v.begin() + x;
vector<int>::const_iterator till =  v.begin() + x + y;

它不会创建另一个vector,但在任何vector操作中,位置(和实际值)可能会无效。