有没有一种方法可以在std::向量的特定位置重复插入元素
Is there a way to repeatedly insert an element at a specific position to a std::vector?
我知道我的问题似乎与这个问题非常相似,但那里提供的解决方案在这种情况下不起作用。
我想做的很简单,把一个元素放在向量中的一个特定位置。
#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::map
或std::unordered_map
。它们具有您所描述的确切行为,但没有插入额外的元素。
std::map<int, int> m;
m[0] = 0;
m[0] = 0;
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 干净地破坏动态定位对象的向量
- 通过在排序向量上使用二叉搜索来定位未排序向量中的元素
- 使用 std::find 在向量中定位随机生成的数字
- C++中向量的解定位
- TC++PL书中练习中向量ctor的定位错误
- 在push_back到静态向量之后C++取消定位
- 嵌套c++向量的重新定位
- 当向量需要更多内存并重新定位内存时,指针会发生什么