【问题标题】:What is the most painless approach to insert an element in the middle of the std::vector在 std::vector 中间插入元素的最简单方法是什么
【发布时间】:2009-11-03 15:23:37
【问题描述】:

我希望能够在向量的中间(或其他位置)插入一个元素,而不会覆盖现有元素。

假设我的向量有 3 6 9 10,我想在 6 之后插入 7。应该如何在不引起问题的情况下完成?这是非常罕见的操作,因此效率在这里不是问题。此外,此时,我无法切换到另一个适合在中间插入的容器(例如:std::list)。

向量中的std::insert 会做我想要的吗?怎么样?

谢谢

【问题讨论】:

  • 您不能在向量的“中间”插入元素而不覆盖插入位置之后的所有元素:它们将被移动到向量的末尾以为新元素留出空间(元素 n 将在 n+1 处复制,元素 n-1 将在 n 处复制,依此类推,从而覆盖现有元素。
  • 这当然意味着任何现有的迭代器和指向向量的指针都将失效(因为它们可能是在普通的旧 push_back() 之后)。

标签: c++ stl


【解决方案1】:

这个操作有vector::insert

iterator insert(
   iterator _Where,
   const Type& _Val
);
void insert(
   iterator _Where,
   size_type _Count,
   const Type& _Val
);

【讨论】:

    【解决方案2】:

    我已将示例编辑为在“6”之后直接插入“7”,因为问题更多是关于在特定位置插入,而不是在向量中心任意插入。

    std::vector<int> v;
    v.push_back(3);
    v.push_back(6);
    v.push_back(9);
    v.push_back(10);
    std::vector<int>::iterator insert_pos = std::find(v.begin(), v.end(), 6);
    // only increment iterator if we've found the insertion point,
    // otherwise insert at the end of the vector
    if (insert_pos != v.end()) {
        ++insert_pos;
    }
    v.insert(insert_pos, 7);
    // v now contains 3, 6, 7, 9, 10
    

    【讨论】:

    • 也许在find要插入的索引处添加一行?
    • 是的,我最初把注意力集中在问题的“中间”部分,我觉得有点过于字面意思了 :)
    【解决方案3】:

    同时使用vector::findvector::insert,按照上面的cmets,给出以下代码:

    std::vector<int> v;
    v.push_back(3);
    v.push_back(6);
    v.push_back(9);
    v.push_back(10);
    std::vector<int>::iterator pos = std::find(v.begin(),v.end(), 6);
    v.insert(pos, 7);
    

    【讨论】:

    • 这不会编译 - find 不是 std::vector 的成员,只是关联容器的成员。您需要使用 std::find 来查找插入点。
    • 抱歉,咖啡前的回答。修复为使用 std::find 代替。
    【解决方案4】:

    如果你的向量是有序的,你可以通过避免线性搜索来优化插入:

    std::vector<int> v;
    v.push_back(3);
    v.push_back(6);
    v.push_back(9);
    v.push_back(10);
    
    std::insert(std::upper_bound(v.begin(), v.end(), 7), 7);
    

    【讨论】:

    • 也许你应该说它需要#include &lt;algorithm&gt;,但这正是我想要的,谢谢+1。
    【解决方案5】:

    您可能想要使用向量的插入成员函数。

    【讨论】:

      【解决方案6】:

      Mash 的示例代码很中肯(但请注意,它会以奇数大小插入您期望的位置)。此外,即使您说效率不是问题,您也可以考虑使用 vector 的 reserve() 成员函数来避免重新分配和隐藏复制。 (“不要过早地悲观”,正如 Sutter 和 Alexandrescu 在C++ 编码标准中所说。)

      【讨论】:

        猜你喜欢
        • 2011-01-15
        • 1970-01-01
        • 2020-12-20
        • 2022-01-10
        • 1970-01-01
        • 2019-08-31
        • 2011-04-09
        • 1970-01-01
        相关资源
        最近更新 更多