假设我有一个std::vector
(让我们称之为myVec
)大小N
.构造由元素X到Y的副本组成的新向量的最简单方法是什么,其中0 <= X <= Y <= N-1?例如,myVec [100000]
通过myVec [100999]
大小的向量150000
.
如果使用向量无法有效地完成此操作,是否应该使用另一种STL数据类型?
vector::const_iterator first = myVec.begin() + 100000; vector ::const_iterator last = myVec.begin() + 101000; vector newVec(first, last);
这是构造新向量的O(N)操作,但实际上并没有更好的方法.
只需使用向量构造函数.
std::vectordata(); // Load Z elements into data so that Z > Y > X std::vector sub(&data[100000],&data[101000]);
std::vector(input_iterator, input_iterator)
,在您的情况下foo = std::vector(myVec.begin () + 100000, myVec.begin () + 150000);
,请参见此处
这几天,我们用span
s!所以你会写:
#include... auto start_pos = 100000; auto length = 1000; auto span_of_myvec = gsl::make_span(myvec); auto my_subspan = span_of_myvec.subspan(start_pos, length);
得到1000个与myvec
s 相同类型的元素.现在,这不是副本,它只是向量中的数据视图,所以要小心.如果你想要一个实际的副本,你可以这样做:
std::vectornew_vec(my_subspan.cbegin(), my_subspan.cend());
笔记:
随着C++ 20你会用gsl
和gsl
,而不是gsl
.
有关跨距的更多信息,请参阅:什么是"跨度"以及何时应该使用跨度?
如果两者都不会被修改(不添加/删除项目-修改现有的罚款,只要你留意线程问题),你可以简单地绕过data.begin() + 100000
和data.begin() + 101000
,假装他们是begin()
和end()
一个较小的载体.
或者,由于矢量存储保证是连续的,您可以简单地传递1000个项目数组:
T *arrayOfT = &data[0] + 100000; size_t arrayOfTLength = 1000;
这两种技术都需要持续时间,但要求数据长度不会增加,从而触发重新分配.
你没有提到什么类型std::vector<...> myVec
,但如果它是一个简单的类型或结构/类,不包含指针,并且你想要最好的效率,那么你可以做一个直接的内存复制(我认为它会比提供其他答案).下面是一个普通的例子std::vector
,其中type
在这种情况下int
:
typedef int type; //choose your custom type/struct/class int iFirst = 100000; //first index to copy int iLast = 101000; //last index + 1 int iLen = iLast - iFirst; std::vectornewVec; newVec.resize(iLen); //pre-allocate the space needed to write the data directly memcpy(&newVec[0], &myVec[iFirst], iLen*sizeof(type)); //write directly to destination buffer from source buffer