Gre*_*ers 343
vector<T>::const_iterator first = myVec.begin() + 100000;
vector<T>::const_iterator last = myVec.begin() + 101000;
vector<T> newVec(first, last);
Run Code Online (Sandbox Code Playgroud)
这是构造新向量的O(N)操作,但实际上并没有更好的方法.
Mar*_*ork 84
只需使用向量构造函数.
std::vector<int> data();
// Load Z elements into data so that Z > Y > X
std::vector<int> sub(&data[100000],&data[101000]);
Run Code Online (Sandbox Code Playgroud)
Dav*_*óth 29
这个讨论已经很老了,但最简单的一个还没有提到,列表初始化:
vector<int> subvector = {big_vector.begin() + 3, big_vector.end() - 2};
Run Code Online (Sandbox Code Playgroud)
它需要 c++11 或更高版本。
用法示例:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<int> big_vector = {5,12,4,6,7,8,9,9,31,1,1,5,76,78,8};
vector<int> subvector = {big_vector.begin() + 3, big_vector.end() - 2};
cout << "Big vector: ";
for_each(big_vector.begin(), big_vector.end(),[](int number){cout << number << ";";});
cout << endl << "Subvector: ";
for_each(subvector.begin(), subvector.end(),[](int number){cout << number << ";";});
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
结果:
Big vector: 5;12;4;6;7;8;9;9;31;1;1;5;76;78;8;
Subvector: 6;7;8;9;9;31;1;1;5;76;
Run Code Online (Sandbox Code Playgroud)
ein*_*ica 13
这几天,我们用spans!所以你会写:
#include <gsl/span>
...
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);
Run Code Online (Sandbox Code Playgroud)
得到1000个与myvecs 相同类型的元素.现在,这不是副本,它只是向量中的数据视图,所以要小心.如果你想要一个实际的副本,你可以这样做:
std::vector<T> new_vec(my_subspan.cbegin(), my_subspan.cend());
Run Code Online (Sandbox Code Playgroud)
笔记:
gsl和gsl,而不是gsl.Ecl*_*pse 10
如果两者都不会被修改(不添加/删除项目-修改现有的罚款,只要你留意线程问题),你可以简单地绕过data.begin() + 100000和data.begin() + 101000,假装他们是begin()和end()一个较小的载体.
或者,由于矢量存储保证是连续的,您可以简单地传递1000个项目数组:
T *arrayOfT = &data[0] + 100000;
size_t arrayOfTLength = 1000;
Run Code Online (Sandbox Code Playgroud)
这两种技术都需要持续时间,但要求数据长度不会增加,从而触发重新分配.
你没有提到什么类型std::vector<...> myVec,但如果它是一个简单的类型或结构/类,不包含指针,并且你想要最好的效率,那么你可以做一个直接的内存复制(我认为它会比提供其他答案).下面是一个普通的例子std::vector<type> myVec,其中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::vector<type> newVec;
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
Run Code Online (Sandbox Code Playgroud)
你可以用 insert
vector<type> myVec { n_elements };
vector<type> newVec;
newVec.insert(newVec.begin(), myVec.begin() + X, myVec.begin() + Y);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
288232 次 |
| 最近记录: |