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

时间:2017-11-08 21:16:47

标签: c++ vector

我知道我的问题与this one非常相似,但在这种情况下提供的解决方案并不适用。

我想做的事情非常简单,将元素放在向量中的特定位置。

#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";
    }
}

输出

1
0

但我希望输出只是1

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

澄清:

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

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

1 个答案:

答案 0 :(得分:5)

你混淆了两个独立的操作。插入元素,并赋值给元素。插入会在向量中创建一个新元素,从而增加其大小。赋值会更改已存在的元素的值。您对MailItem.PropertyAccessor.GetProperty的两次调用实际上都在做同样的事情。它们将元素插入到矢量的前部位置,并将所有现有元素向下移动1。

您似乎要求的是一个操作,该操作分配给给定索引处的元素,但如果该元素尚未存在,则首先插入该元素。 insert没有这样的操作,但你可以编写一个允许你这样做的函数。

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; std::map。它们具有您描述的确切行为,但不会插入额外的元素。

std::unordered_map