我知道我的问题看起来与此问题非常相似,但在这种情况下提供的解决方案不起作用.
我想要做的是非常简单,将元素放在向量中的特定位置.
#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)多次调用该函数,所以我想找到一种不增加向量大小的方法替换指定位置的值.
你混淆了两个独立的操作.插入元素,并赋值给元素.插入会在向量中创建一个新元素,从而增加其大小.赋值会更改已存在的元素的值.你的两个电话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::map或std::unordered_map代替.它们具有您描述的确切行为,但不插入额外的元素.
std::map<int, int> m;
m[0] = 0;
m[0] = 0;
Run Code Online (Sandbox Code Playgroud)