检查std :: vector中是否存在给定索引

时间:2013-07-17 12:52:31

标签: c++ vector iterator std

我需要对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

4 个答案:

答案 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迭代器,您可以遍历所有元素并执行相应的操作,如删除元素