如何将元素插入向量的开头?
Posted
技术标签:
【中文标题】如何将元素插入向量的开头?【英文标题】:How can I insert element into beginning of vector? 【发布时间】:2018-01-14 15:42:23 【问题描述】:我需要将值插入std::vector
的开头,并且我需要将此向量中的其他值推到更远的位置,例如:添加到向量开头的东西和从位置 1 移动到 2 的值,从2到3等。
我该怎么做?
【问题讨论】:
请记住,将内容推送到向量的前面是一个 O(n) 操作,因此如果您需要重复执行此操作,您可能希望使用更优化的数据结构(例如如std::deque
),或使用其他技巧(例如,如果您只在前面添加和删除内容,只需在最后执行此操作并反向显示)。
【参考方案1】:
使用std::vector::insert 函数接受iterator to the first element 作为目标位置(在其之前插入元素的迭代器):
#include <vector>
int main()
std::vector<int> v 1, 2, 3, 4, 5 ;
v.insert(v.begin(), 6);
或者,append 元素并在右侧执行rotation:
#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
的第一个参数称为提示,我会说它更像是一个目标位置。
它正在工作,非常感谢。我还有一个问题。我制作了比较 2 个向量的循环,当值不匹配时,代码会将错误的值插入向量的开头。我现在如何从旧位置删除错误的值?
@PawełSzymkowicz:使用std::rotate
将其置于首位。比插入和删除更干净、更高效。
@JerryCoffin 为什么push_back
&rotate
比insert
快?
@Hope:注意关于插入和删除的注释。如果我们只需要插入一个值,那么 yes insert 将是显而易见的选择。但至少当我读到它时,我们正在删除一个,并插入另一个(在不同的地方,所以我们不能只覆盖现有值)。不是 100% 肯定 push_back/rotate 会更快——他对一些细节有点模糊。 OTOH,鉴于我们显然主要在一种情况下添加到前面,可能也值得考虑使用deque
。【参考方案2】:
您应该考虑使用std::deque
。它的工作原理很像 std::vector
,但您可以从前面和结尾添加和删除项目。
它通过将内部存储分成更小的块来实现这一点。您仍然拥有具有良好查找速度的随机访问迭代器。
如果您的容器很小,使用std::vector
方法应该没问题,但如果您存储大量数据,则std::deque
s 在前面插入/删除的性能会好得多。
【讨论】:
这并没有回答问题,而是假设作者不知道优化。 @AshutoshTiwari 它提供了与公认答案不同的解决方案。这是对一个问题有多个答案的好处之一。它们相辅相成。 好的@superman。【参考方案3】:这个怎么样?
#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 是否为空等。
【讨论】:
【参考方案4】:你可以试试这个
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
插入后每个元素都向右移动
【讨论】:
【参考方案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
【讨论】:
以上是关于如何将元素插入向量的开头?的主要内容,如果未能解决你的问题,请参考以下文章