12

我需要对 my 的索引访问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不可能)。可以使用 astd::map但也许也可以使用std::vector.

4

4 回答 4

11

问题中的要求并不完全清楚,但我假设你想以 结束testVector[position] == value,无论是否position在开始的范围内。

如果向量太小,请先增大向量。这将在已经存在的任何内容之后插入零值。

if (position >= testVector.size()) {
    testVector.resize(position+1);
}

然后分配要设置的元素:

testVector[position] = value;
于 2013-07-17T13:08:57.703 回答
8

我不相信这个问题很清楚。如果你想

“首先删除它们,然后设置一个新值。”

这可能有效

void SetVector(int position, int value) {
    if (position < testVector.size()) {
        testVector[position] = value;
    }
    else {
        testVector.push_back(value);
    }
}

你真的应该做int positiontestVectorsize_type

于 2013-07-17T13:06:39.430 回答
3

如果您在此索引处没有任何内容,则可以使用抛出异常的std::vector::at 。

该函数自动检查 n 是否在向量中有效元素的范围内,如果不在则抛出 out_of_range 异常(即,如果 n 大于或等于其大小)。这与不检查边界的成员 operator[] 形成对比。

并且由于您在给定索引处获得对象的引用,因此您可以更改/删除该值

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;
   }
}
于 2013-07-17T12:58:27.730 回答
0

首先通过使用为您的向量获取迭代器

 std::vector<int>::iterator it;

it = myvector.begin();

for (it=myvector.begin(); it<myvector.end(); it++)
    std::cout << ' ' << *it;

使用 thsi 迭代器,您可以遍历所有元素并执行相应的操作,例如删除元素

于 2013-07-17T12:56:52.727 回答