【问题标题】:Is there a way to repeatedly insert an element at a specific position to a std::vector?有没有办法将特定位置的元素重复插入到 std::vector?
【发布时间】:2017-11-08 21:16:47
【问题描述】:

我知道我的问题与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 的第一个参数),所以我想找到一种不增加向量大小并简单地替换指定位置的值的方法。

【问题讨论】:

  • 对于任何投反对票的人,如果您能快速评论一下您这样做的原因,我将不胜感激,以便我改进问题。
  • 您已经插入了两次相同的号码。你怎么知道第二个插入在哪个位置?
  • 你怎么知道插入发生在错误的位置? @BenjaminLindley:你更快!
  • 自编辑以来,这更加令人困惑。你不能说你想“插入,换句话说,替换”。插入和替换是完全不同的操作。插入总是会增加向量的大小。
  • @db7638 没有人能说出你想问什么——这取决于你要更清楚。赋值运算符执行“替换”的操作。 insert 函数执行“插入”操作。如果要插入然后替换,则应调用一次insert 函数,然后使用一次赋值运算符。不调用两次插入函数。

标签: c++ vector


【解决方案1】:

您混淆了两个独立的操作。插入元素,并分配给元素。插入在向量中创建一个新元素,增加它的大小。赋值会更改已经存在的元素的值。您对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;

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

std::map<int, int> m;
m[0] = 0;
m[0] = 0;

【讨论】:

  • 是的,这就是我想要的。感谢您指出我的问题最初的不准确之处。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 2015-06-14
  • 2011-10-19
  • 1970-01-01
  • 2019-09-28
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多