假设我有一个大小为n的std::vector(让我们称之为myVec),构造一个由元素X到Y的副本组成的新向量,其中0 <= X <= Y <= N-1,最简单的方法是什么?例如,大小为150000的向量中的myVec[100000]到myVec[100999]。

如果这不能有效地用一个向量,是否有另一种STL数据类型,我应该使用代替?


当前回答

如果这两个都不打算修改(不添加/删除项-只要注意线程问题,修改现有项就可以),您可以简单地传递data.begin() + 100000和data.begin() + 101000,并假装它们是一个更小的向量的begin()和end()。

或者,因为矢量存储保证是连续的,你可以简单地传递一个1000项数组:

T *arrayOfT = &data[0] + 100000;
size_t arrayOfTLength = 1000;

这两种技术都需要固定的时间,但要求数据长度不增加,从而触发重新分配。

其他回答

也许GSL库中的array_view/span是一个不错的选择。

这里还有一个单独的文件实现:array_view。

当M是子向量的大小时,可以使用性能为O(M)的STL复制。

将元素从一个向量复制到另一个向量很容易 在这个例子中,为了便于理解,我使用了一对向量 `

vector<pair<int, int> > v(n);

//we want half of elements in vector a and another half in vector b
vector<pair<lli, lli> > a(v.begin(),v.begin()+n/2);
vector<pair<lli, lli> > b(v.begin()+n/2, v.end());


//if v = [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
//then a = [(1, 2), (2, 3)]
//and b = [(3, 4), (4, 5), (5, 6)]

//if v = [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]
//then a = [(1, 2), (2, 3), (3, 4)]
//and b = [(4, 5), (5, 6), (6, 7)]

' 正如你所看到的,你可以很容易地将元素从一个向量复制到另一个向量,例如,如果你想将元素从索引10复制到索引16,那么我们将使用

vector<pair<int, int> > a(v.begin()+10, v.begin+16);

如果你想让元素从索引10到末尾的某个索引,那么在这种情况下

vector<pair<int, int> > a(v.begin()+10, v.end()-5);

希望这有助于,只要记住在最后的情况下v.end()-5 > v.begin()+10

vector<T>::const_iterator first = myVec.begin() + 100000;
vector<T>::const_iterator last = myVec.begin() + 101000;
vector<T> newVec(first, last);

这是一个O(N)运算来构造新的向量,但是没有更好的方法了。

如果这两个都不打算修改(不添加/删除项-只要注意线程问题,修改现有项就可以),您可以简单地传递data.begin() + 100000和data.begin() + 101000,并假装它们是一个更小的向量的begin()和end()。

或者,因为矢量存储保证是连续的,你可以简单地传递一个1000项数组:

T *arrayOfT = &data[0] + 100000;
size_t arrayOfTLength = 1000;

这两种技术都需要固定的时间,但要求数据长度不增加,从而触发重新分配。