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); } |
在第二种情况下,如果您知道向量中元素的索引(例如,
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); } |