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

如果这不能有效地用一个向量,是否有另一种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<int> vect1{1, 2, 3, 4};
 vector<int> vect2;

方法1。使用拷贝功能。copy(first_iterator_index, last_iterator_index, back_inserter()):-该函数有3个参数,首先,旧vector的第一个迭代器。其次,old vector的最后一个迭代器和第三个迭代器是back_inserter函数,用于从back插入值。

    // Copying vector by copy function
    copy(vect1.begin(), vect1.end(), back_inserter(vect2));

方法2。通过使用赋值函数。分配(first_iterator_o last_iterator_o)。该方法将相同的值赋给新向量和旧向量。它有两个参数,第一个迭代器指向旧向量,最后一个迭代器指向旧向量。

    //Copying vector by assign function
    vect2.assign(vect1.begin(), vect1.end());

你没有提到什么类型std::vector<…> myVec是,但如果它是一个简单的类型或结构/类,不包括指针,你想要最好的效率,那么你可以做一个直接的内存复制(我认为这将比其他答案提供的更快)。下面是std::vector<type> myVec的一般示例,这里的类型是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

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

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

std::vector<T>(input_iterator, input_iterator),在你的情况下,foo = std::vector<T>(myVec。begin () + 100000, myVec。Begin() + 150000);,参见这里的示例

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