C++中的向量迭代和删除

3

我试图迭代一个向量并删除对象的第一次出现。我一直在得到编译错误(使用g++),但我按照stackoverflow答案和其他来源建议的方式进行删除。可能是我错过了一些非常简单的东西,所以需要另一双眼睛来帮忙。

#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;

bool Garage::remove(const Car &car){
assert(!empty());

int size = v.size();
for(vector<Car>::const_iterator it = v.begin(); it != v.end(); ++it){
    if(it -> Car::make() == car.Car::make()){
        it = v.erase(it);
        assert(v.size() == size - 1);
        return true;
     }
 }
 return false;
}

编译错误是:error: no matching function for call to 'std::vector::erase(const Car&)'。

请不要使用作业标签。[它已被弃用。] (http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated) - chris
2
你应该搜索“erase/remove”习语... - K-ballo
@chris 抱歉,我不经常来这里,所以我没有意识到这个标签已经不再使用了。人们曾经告诉我要添加它。 - Sams
我尝试了*it和it,但两者都给了我相同的错误。 - Sams
我确实查看了erase/remove算法,它似乎是用于删除多个出现的情况,但我只想删除第一次出现的情况。 - Sams
显示剩余3条评论
2个回答

3

您正在尝试使用const_iterator进行清除操作。由于您正在尝试修改向量,请切换到常规迭代器。

for(vector<Car>::iterator it = v.begin(); it != v.end(); ++it){

这个有效:

int main()
{
   vector<int> ints;

   for (vector<int>::iterator iter = ints.begin();iter != ints.end();++iter)
   {
      ints.erase(iter);
   }
}

这个不行:

int main()
{
   vector<int> ints;

   for (vector<int>::const_iterator iter = ints.begin();iter != ints.end();++iter)
   {
      ints.erase(iter);
   }
}

使用const_iterator时出错:

test.cpp:18:22: error: no matching function for call to ‘std::vector<int>::erase(std::vector<int>::const_iterator&)’

我去掉了const,现在可以编译了。只需要大量测试一下就行了。 - Sams
请注意,在遵循C++11标准的编译器上,使用const_iterator是可以正常工作的。 - Bo Persson
1
@Bo Persson 你使用的是哪个版本的gcc?我正在运行4.6.3(g++ -std=c++0x),它不支持const_iterator。我看到在这里指定了,但是gcc还不支持吗?http://en.cppreference.com/w/cpp/container/vector/erase - Ryan Guthrie

1

看起来你需要使用find来查找元素的索引,然后erase它。我说“看起来”是因为我不是C++程序员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接