读书人

C++ 小疑点

发布时间: 2013-06-25 23:45:42 作者: rapoo

C++ 小问题
// 这个程序到了按名字移除那里时崩溃了,具体原因不知道,为什么会这样呢?


#include<iostream>
#include<string>
#include<vector>
using namespace std;

class Student {
public:
string name_;
int id_;
static int count;
public:
Student (string name,int id) {
id_ = id;
name_ = name;
count++;
}
};
int Student::count = 0;
class Group {
private:
string name_;
public:
std::vector<Student*> vec;

Group (string name) {
name_ = name;
}
void AddStudent (Student* stu) {
if(vec.size() == 0 ) {
vec.push_back(stu);
}
else {
bool flag = true;
for (vector<Student*>::size_type ix = 0; ix< vec.size();ix++) {
if(vec[ix] == stu ) {
flag = false;
break;
}
}
if(flag == true) vec.push_back(stu);


}
}
string GetGroupName () {
return name_;
}
int GetNumberOfStudents () {
return vec.size();
}
void RemoveStudentById (int id) {
for(vector<Student*>::iterator it = vec.begin(); it != vec.end() ;it++)
if((*it)->id_ == id) vec.erase(it);
}
void RemoveStudentByName (string name) {
for(vector<Student*>::iterator it = vec.begin(); it != vec.end() ;it++)
if((*it)->name_ == name) vec.erase(it);
}
};
int main(int argc, char *argv[]) {
Student A("a", 1);
Student B("b", 2);
Student C("c", 3);
Student D("a", 4);

Group group("basketball");
group.AddStudent(&A);
group.AddStudent(&A);
group.AddStudent(&B);
group.AddStudent(&C);
group.AddStudent(&D);


group.RemoveStudentByName("a");

std::cout << "The number of students in group("
<< group.GetGroupName() + "): "
<< group.GetNumberOfStudents() << std::endl;


getchar();
return 0;
}
C++
[解决办法]
迭代器失效造成的,试试下面的。


for(vector<Student*>::iterator it = vec.begin(); it != vec.end() ;)
if((*it)->name_ == name) it = vec.erase(it);
else ++it;

RemoveStudentById 的处理逻辑存在同样的问题,只不过还没崩溃而已。其实用标准库最好了,比如 RemoveStudentByName 可以这样写。



vec.erase(std::remove_if(vec.begin(),vec.end(),
[&](Student const*s){return s->name_==name;}),
vec.end());

[解决办法]
引用:
RemoveStudentById 的处理逻辑存在同样的问题,只不过还没崩溃而已。其实用标准库最好了,比如 RemoveStudentByName 可以这样写。

vec.erase(std::remove_if(vec.begin(),vec.end(),
[&](Student const*s){return s->name_==name;}),
vec.end());


大神这个能解释一下吗?没有看懂,好像也没有见过remove_if(.....)的东东,谢谢
remove_if 移除满足指定条件的元素,条件的判定由 remove_if 的第三个参数执行,这里是一个 lambda,判断当前元素的 name_ 是否与 RemoveStudentByName 形参中的 name 相等。remove_if 返回一个迭代器,指向经移除后新序列的尾端,然后 erase 将该点起始至原序列尾端的所有元素删除。两者合作达到删除满足指定条件元素的目的。
[解决办法]
引用:
Quote: 引用:

[remove_if 移除满足指定条件的元素,条件的判定由 remove_if 的第三个参数执行,这里是一个 lambda,判断当前元素的 name_ 是否与 RemoveStudentByName 形参中的 name 相等。remove_if 返回一个迭代器,指向经移除后新序列的尾端,然后 erase 将该点起始至原序列尾端的所有元素删除。两者合作达到删除满足指定条件元素的目的。


不过,这个不能编译啊 ?、

把你编译器版本和错误信息发上来。lambda 需要 c++11 的支持,旧一些的编译器可能不认。

读书人网 >C++

热点推荐