有没有办法在std :: vector的特定位置重复插入一个元素?

db7*_*638 -2 c++ vector

我知道我的问题看起来与问题非常相似,但在这种情况下提供的解决方案不起作用.

我想要做的是非常简单,将元素放在向量中的特定位置.

#include <vector>

int main()
{
    std::vector<int> vec;
    vec.reserve(2);

    vec.insert(vec.begin() + 0, 0);
    vec.insert(vec.begin() + 0, 1);

    for (size_t i = 0; i < vec.size(); i++)
    {
    std::cout << vec.at(i) << "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

1
0
Run Code Online (Sandbox Code Playgroud)

但我希望输出正好1.

第二次insert,元素插入0th位置,元素先前0th移动到1st位置.我希望第二个调用与insert第一个调用具有相同的确切效果,即将元素插入到第0个位置.换句话说,我希望第二次调用insert替换0th位置的值.我该怎么做呢?

澄清:

我在这个问题中包含的代码是我想要的简短示例.我正在调用insert两次,但是insert两个调用中的第一个参数是相同的,所以我不明白为什么第二次调用会insert改变大小.

在我的实际代码中,插入调用受互斥锁保护并由a 调用std::thread,thread可能会insert为同一位置(第一个参数insert)多次调用该函数,所以我想找到一种不增加向量大小的方法替换指定位置的值.

Ben*_*ley 5

你混淆了两个独立的操作.插入元素,并赋值给元素.插入会在向量中创建一个新元素,从而增加其大小.赋值会更改已存在的元素的值.你的两个电话insert都在做同样的事情.它们将元素插入向量的前置位置,并将所有现有元素向下移动1.

您似乎要求的是一个操作,该操作分配给给定索引处的元素,但如果该元素尚不存在,则首先插入该元素.std::vector没有这样的操作,但你可以编写一个允许你这样做的功能.

template<typename T, typename A>
T& getElement(std::vector<T, A>& v, size_t N) {
    if (N >= v.size())
        v.resize(N + 1);
    return v[N];
}

// usage
getElement(vec, 4) = 7;
Run Code Online (Sandbox Code Playgroud)

这具有在该索引之前的任何位置插入默认构造元素的副作用,这些位置在向量中尚不存在,这对我来说似乎不是很理想.也许你应该考虑使用std::mapstd::unordered_map代替.它们具有您描述的确切行为,但不插入额外的元素.

std::map<int, int> m;
m[0] = 0;
m[0] = 0;
Run Code Online (Sandbox Code Playgroud)