我在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";
}
}
然而,当我运行它时,它会返回:
error: no matching function for call to 'std::vector<int>::erase(int&)'
第13行。
为什么会这样,我该如何纠正?
答案 0 :(得分:10)
您无法直接从向量中删除值(向量是序列容器,而不是关联容器):您需要为要删除的元素提供迭代器。
为了获得迭代器,您可以:
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);
}
上面的代码使用了一些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);
}
在第二种情况中,如果您知道向量中的元素的索引(例如,pos
),那么您可以轻松获得迭代器这样:
v.begin() + pos
或者(仅限C ++ 11)你可以这样做:
next(begin(v), pos);
答案 1 :(得分:3)
你必须传递一个迭代器来擦除。所以试试
poss.erase(poss.begin() + random);
答案 2 :(得分:0)
向量擦除函数使用迭代器而不是值。 此外,您还需要检查边界条件,以查看您正在擦除的索引不会超出范围。
std::vector<int>::iterator itr = poss.begin() + random;
if(itr != poss.end())
{
poss.erase(itr);
}