【问题标题】: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),或使用其他技巧(例如,如果您只在前面添加和删除内容,只需在最后执行此操作并反向显示)。

标签: c++ visual-c++ vector std


【解决方案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&rotateinsert 快?
  • @Hope:注意关于插入和删除的注释。如果我们只需要插入一个值,那么 yes insert 将是显而易见的选择。但至少当我读到它时,我们正在删除一个,并插入另一个(在不同的地方,所以我们不能只覆盖现有值)。不是 100% 肯定 push_back/rotate 会更快——他对一些细节有点模糊。 OTOH,鉴于我们显然主要在一种情况下添加到前面,可能也值得考虑使用deque
【解决方案2】:

您应该考虑使用std::deque。它的工作原理很像 std::vector,但您可以从前面和结尾添加和删除项目。

它通过将内部存储分成更小的块来实现这一点。您仍然拥有具有良好查找速度的随机访问迭代器。

如果您的容器很小,使用std::vector 方法应该没问题,但如果您存储大量数据,则std::deques 在前面插入/删除的性能会好得多。

【讨论】:

  • 这并没有回答问题,而是假设作者不知道优化。
  • @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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        相关资源
        最近更新 更多