关于c ++:矢量擦除错误

Vector Erase Error

我在C++中有以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
int main ()
{
    srand(time(0));
    int noOfElements = 9;
    for (int a = 0; a < 9; a++)
    {
        std::vector<int> poss;
        for (int a = 1; a <= 9; a++)
            poss.push_back(a);
        for (int b = 0; b < 9; b++)
        {
            int random = rand() % 9;
            std::cout << poss[random];
            poss.erase(random);
            noOfElements--;
        }
        std::cout <<"
"
;
    }
}

但当我运行它时,它返回:

1
error: no matching function for call to 'std::vector<int>::erase(int&)'

第13行。

这是为什么?我如何纠正?


不能直接从向量中删除值(向量是序列容器,而不是关联容器):需要为要删除的元素提供迭代器。

为了获得迭代器,您可以:

  • 根据元素的值查找元素(例如使用std::find()),然后在erase()成员函数的输入中提供返回的迭代器,或者
  • 通过对指向向量开头的迭代器(即begin()成员函数返回的对象)应用偏移量获得它。

在第一种情况下:

1
2
3
4
5
6
7
8
9
#include <vector>
#include

int main()
{
    std::vector<int> v { 1, 2, 3};
    auto i = std::find(begin(v), end(v), 2);
    v.erase(i);
}

上面的代码使用了一些C++ 11的特性。在C++ 03中,它将如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
#include

int main()
{
    std::vector<int> v;

    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    std::vector<int>::iterator i = std::find(v.begin(), v.end(), 2);
    v.erase(i);
}

在第二种情况下,如果您知道向量中元素的索引(例如,pos),那么您可以通过以下方式轻松获得迭代器:

1
v.begin() + pos

或者(C++ 11),你可以这样做:

1
next(begin(v), pos);


必须传递迭代器才能擦除。所以尝试

1
poss.erase(poss.begin() + random);


矢量擦除函数采用迭代器而不是值。另外,您还需要检查边界条件,以查看正在删除的索引是否超出了界限。

1
2
3
4
5
std::vector<int>::iterator itr = poss.begin() + random;
if(itr != poss.end())
{
  poss.erase(itr);
}