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

Check if a given index exists in std::vector

本文关键字:存在 索引 std vector 检查 是否      更新时间:2023-10-16

我需要对std::vector进行索引访问,因此我必须检查索引是否已经可用,以便首先删除它们,然后设置新值。

这是我的setter函数:

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

问题中的要求并不完全清楚,但我假设您希望最终得到testVector[position] == value,无论position一开始是否在范围内。

如果矢量太小,请先增长它。这将在已经存在的值之后插入零值。

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

然后指定要设置的元素:

testVector[position] = value;

我认为这个问题不清楚。如果你想要

"先删除它们,然后设置一个新值。"

这可能适用于

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

你真的应该把int position变成testVectorsize_type

如果在该索引中没有任何内容,则可以使用std::vector::at which抛出异常。

函数会自动检查n是否在向量中的有效元素,如果不是(即,如果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;
   }
}

首先使用为向量获取迭代器

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

it = myvector.begin();

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

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