有没有一种方法可以在std::向量的特定位置重复插入元素

Is there a way to repeatedly insert an element at a specific position to a std::vector?

本文关键字:向量 定位 元素 插入 位置 std 一种 方法 有没有      更新时间:2023-10-16

我知道我的问题似乎与这个问题非常相似,但那里提供的解决方案在这种情况下不起作用。

我想做的很简单,把一个元素放在向量中的一个特定位置。

#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

第二次Iinsert,元素被插入在0th位置,并且先前在0th的元素移动到1st位置。我希望对insert的第二次调用与第一次调用具有完全相同的效果,即将元素插入到第0个位置。换句话说,我希望insert的第二次调用替换0th位置的值。我该怎么做?

澄清:

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

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

您混淆了两个独立的操作。插入一个元素,并指定给一个元素。插入会在矢量中创建一个新元素,从而增大其大小。赋值会更改已存在的元素的值。事实上,您对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;