我有一个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);
但是最好创建另一个向量,它只是一个指向原始向量的指针,因为我总是按顺序访问元素。
有没有办法在没有复制数据的情况下创建另一个向量?
答案 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
操作中,位置(和实际值)可能会无效。