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

How to copy part of one vector to another in c++

本文关键字:向量 一个 一部分 复制 另一个 c++      更新时间:2023-10-16

我有一个按行大顺序排列的向量中的 matirx。例如:

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

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

有没有办法在不处理数据的情况下创建另一个向量?

这样的事情会有所帮助:

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提供了这个结果之后:

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 位索引中受益

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

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

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