在vector中删除一个元素 2009-02-12 17:30 例如: class classA { public: int e; } vector<classA>; class_vector; 如果要删除第三个,似乎只能按着下面这个方式进行 class_vector.erase(&class_vector[2]); 这种方法太麻烦了比如我要删最后一个 class_vector.erase(&class_vector[class_vector.size()-1]); ------------------------------------ >> 如果要删除第三个,似乎只能按着下面这个方式进行 >> class_vector.erase(&class_vector[2]); &class_vector[2] 的类型是指针,而上述 vector 的 erase 成员函数要求的参数类型是 iterator,两者的类型并不一定兼容,所以你的上述用法对于大多数的编译器来说都是不成立的。 根据 vector 的特点,删除其中间的元素没有什么捷径(不提供按下标删除元素的方法。对于 vector 一般要尽量避免删除中间的元素)。不过,对于删除最后一个元素,vector 提供了非常简洁的方式,并且实现效率也非常高,这就是 pop_back () 操作。 ---------------------------------------------- #include <vector> using namespace std; void main(void) { vector<int> array; array.push_back(1); array.push_back(2); array.push_back(3); array.push_back(4); array.push_back(5); vector<int>::iterator itr = array.begin(); while (itr != array.end) { if (*itr == 3)array.erase(itr);//删除值为3的元素 ++itr; } } //若是最后一个可用array.pop_back() ------------------- 删除所有偶数项,并打印出删除的项 1. vector/queue 正确方法1: void erase(vector<int> &v) { for(vector<int>::iterator vi=v.begin();vi!=v.end();) { if(*vi % 2 == 0) { cout << "Erasing " << *vi << endl; vi = v.erase(vi); } else ++vi; } } 正确方法2: void erase2(vector<int> &v) { for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();) { if(*ri % 2 == 0) { cout << "Erasing " << *ri << endl; v.erase((++ri).base()); //erase()函数期待的是正向iterator,故而这里要调 //用base()函数将逆向iterator转换为正向的 } else ++ri; } } 2.map/list 正确方法 void erase(map<int,int> &m) { for(map<int,int>::iterator mi=m.begin();mi!=m.end();) { if(mi->second % 2 == 0) { cout << "Erasing " << mi->second << endl; m.erase(mi++); } else ++mi; } }