我需要对std::vector
进行索引访问,因此我必须检查索引是否已经可用于先删除它们,然后设置一个新值。
这是我的二传手功能:
void SetVector(int position, int value) {
std::vector<int>iterator it = testVector.begin();
// need a check here
testVector.insert(it-testVector.begin()+position, value);
}
或者这是否是我需要的错误的C ++集合? (应该动态增长,因此不可能std:array
)。可以使用std::map
,但也可以使用std::vector
。
答案 0 :(得分:9)
问题的要求并不完全清楚,但我假设您希望最终得到testVector[position] == value
,无论position
是否在范围内开始。
如果矢量太小,首先生长矢量。这将在已存在的任何内容之后插入零值。
if (position >= testVector.size()) {
testVector.resize(position+1);
}
然后指定要设置的元素:
testVector[position] = value;
答案 1 :(得分:6)
我不相信这个问题很清楚。如果你想要
“首先删除它们,然后设置一个新值。”
这可能有效
void SetVector(int position, int value) {
if (position < testVector.size()) {
testVector[position] = value;
}
else {
testVector.push_back(value);
}
}
你真的应该int position
testVector
的{{1}}。
答案 2 :(得分:3)
如果此索引中没有任何内容,您可以使用std::vector::at抛出异常。
该函数自动检查n是否在范围内 向量中的有效元素,如果它,则抛出out_of_range异常 不是(即,如果n大于或等于其大小)。这是在 与成员运算符[]形成对比,不检查边界。
由于您获得了给定索引处对象的引用,您可以更改/删除值
void SetVector(int position, int value) {
try
{
testVector.at(position) = value;
}
catch (const std::out_of_range& oor) {
testVector.resize(position + 1);
testVector[position] = value;
}
}
答案 3 :(得分:0)
首先使用
获取向量的迭代器 std::vector<int>::iterator it;
it = myvector.begin();
for (it=myvector.begin(); it<myvector.end(); it++)
std::cout << ' ' << *it;
使用thsi迭代器,您可以遍历所有元素并执行相应的操作,如删除元素