我需要将值插入到 std::vector
的开头,并且需要将该向量中的其他值推到更远的位置,例如:向向量开头添加某些值,然后将从位置1移动到2的值,从2移动到3等。
我该怎么做?
我需要将值插入到 std::vector
的开头,并且需要将该向量中的其他值推到更远的位置,例如:向向量开头添加某些值,然后将从位置1移动到2的值,从2移动到3等。
我该怎么做?
使用std::vector::insert函数,接受一个指向目标位置的迭代器作为目标位置(在其之前插入元素的迭代器):
#include <vector>
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
v.insert(v.begin(), 6);
}
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
v.push_back(6);
std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());
}
insert
的第一个参数称为提示,我会说它更像是目标位置。 - Matteo Italiastd::rotate
将其旋转到第一个位置。比插入和删除更清晰、更高效。 - Jerry Coffinpush_back
和 rotate
比 insert
更快? - Hopedeque
。 - Jerry Coffin您应该考虑使用std::deque
。它的工作原理很像std::vector
,但您可以从前面和后面添加和删除项目。
它通过将内部存储分成较小的块来实现这一点。您仍然具有良好查找速度的随机访问迭代器。
如果您的容器很小,那么使用std::vector
方法就应该没有问题,但是如果您存储大量数据,则std::deque
在插入/删除前端方面的性能将优于std::vector
。
这个怎么样?
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<int> v1 = { 1, 2, 3 };
std::vector<int> v2 = { 4, 5, 6 };
// merge
std::vector<int> dst;
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst));
}
最终 dst 为:{1, 2, 3, 4, 5, 6}
注意:这只是一个示例,因此您应该检查 v1 是否为空等。
vector<int> v={1,2,3,4,5};
for(int i=0;i<5;i++){
v.insert(v.begin(),i+1);
}
输出为{5,4,3,2,1,1,2,3,4,5}
每个元素在插入后都向右移动
你可以从后面将值插入到 std::vector
,然后使用std::reverse
函数:
示例:
#include <vector>
#include <algorhitm>
#include <iostream>
void printVector( std::vector< int > const & _vector )
{
for( auto value : _vector )
{
std::cout << value << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector< int > someVec;
someVec.push_back( 5 );
someVec.push_back( 4 );
someVec.push_back( 3 );
someVec.push_back( 2 );
someVec.push_back( 1 );
// (1)
printVector( someVec );
std::reverse( someVec.begin(), someVec.end() );
// (2)
printVector( someVec );
return 0;
}
输出(1):
5 4 3 2 1
输出(2):
1 2 3 4 5
std::deque
),或者使用其他技巧(例如,如果您只在向量前面添加和删除元素,则可以在向量末尾添加并以相反顺序显示)。 - Matteo Italia