我知道我的问题与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
),所以我想找到一种不增加矢量大小的方法,只需替换指定位置的值即可。
答案 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