矢量擦除错误

Laz*_*h13 1 c++ vector

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

#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 << "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我运行它时,它会返回:

error: no matching function for call to 'std::vector<int>::erase(int&)'
Run Code Online (Sandbox Code Playgroud)

对于第13行.

为什么这样,我该如何纠正呢?

And*_*owl 11

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

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

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

在第一种情况下:

#include <vector>
#include <algorithm>

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

上面的代码使用了一些C++ 11特性.在C++ 03中,它看起来如下:

#include <vector>
#include <algorithm>

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);
}
Run Code Online (Sandbox Code Playgroud)

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

v.begin() + pos
Run Code Online (Sandbox Code Playgroud)

或者(仅限C++ 11),您可以:

next(begin(v), pos);
Run Code Online (Sandbox Code Playgroud)


Too*_*one 6

你必须通过一个迭代器来擦除。所以试试

poss.erase(poss.begin() + random);
Run Code Online (Sandbox Code Playgroud)