一、list存放自定义数据 如果删除某个节点 必 须重载 ==运算符
list容器 对自定义数据排序 重载<运算符
class Person
{
public:
string m_name;
int m_age;
Person(string name, int age):m_age(age), m_name(name){}
bool operator< (const Person& t)
{
return this->m_age < t.m_age;
}
bool operator==(const Person& t)
{
return (t.m_age == this->m_age) && (t.m_name == this->m_name);
}
};
void printlistint(list<Person> l)
{
for (list<Person>::iterator li = l.begin(); li != l.end(); li++)
{
cout << (*li).m_name << " " << (*li).m_age << endl;;
}
}
void test()
{
list<Person> L;
L.push_back(Person("斧王", 48));
L.push_back(Person("火猫", 28));
L.push_back(Person("大牛", 18));
L.push_back(Person("蓝猫", 19));
printlistint(L);
cout << "------------" << endl;
Person tmp("火猫", 28);
L.remove(tmp);
printlistint(L);
cout << "------------" << endl;
L.sort();
printlistint(L);
}
在删除列表元素时,由于是自定义类型,必须要重载==以判定是否为要删除的元素。
在排序时要告诉编译器如何排序 需要重载<运算符。
二、list 对自定义数据排序 指定排序规则
bool myComparePerson(const Person &ob1, const Person &ob2)
{
return ob1.m_age < ob2.m_age;
}
void test01()
{
//存放自定义数据
list<Person> L;
L.push_back(Person("斧王", 48));
L.push_back(Person("火猫", 28));
L.push_back(Person("大牛", 18));
L.push_back(Person("蓝猫", 19));
printlistint(L);
//对于自定义数据 我们可以重载<运算符
L.sort(myComparePerson);
printlistint(L);
三、vector 对自定义数据 排序指定排序规则
方法一、普通函数 实现排序规则
bool myComparePerson(const Person &ob1, const Person &ob2)
{
return ob1.m_age < ob2.m_age;
}
void test02()
{
vector<Person> v;
v.push_back(Person("斧王", 48));
v.push_back(Person("火猫", 28));
v.push_back(Person("大牛", 18));
v.push_back(Person("蓝猫", 19));
//默认比较方式从小‐‐>大
//vector存放自定义数据 可指定排序规则 (普通函数)
sort(v.begin, v.end, myComparePerson);
}
方法二、仿函数 指定排序规则
class myComparePerson2
{
public:
bool operator()(Person &ob1, Person &ob2)
{
return ob1.m_age < ob2.m_age;
}
};
void test03()
{
vector<Person> v;
v.push_back(Person("斧王", 48));
v.push_back(Person("火猫", 28));
v.push_back(Person("大牛", 18));
v.push_back(Person("蓝猫", 19));
//默认比较方式从小‐‐>大
//vector存放自定义数据 可指定排序规则 (普通函数)
//sort(v.begin(),v.end(), myComparePerson);
//vector存放自定义数据 可指定排序规则 (仿函数)
sort(v.begin(), v.end(), myComparePerson2());
}
这里mycomparePerson2()为匿名对象,mycomparePerson2()()为仿函数调用,作用相当于函数mycomparePerson2()。
四、lambda表达式
void myPrintVectorInt(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//指定打印方式
void myPrint01(int val)
{
cout << val << " ";
}
void test06()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//方法1:访问v容器 普通函数
myPrintVectorInt(v);
//方法2:访问v容器 系统算法for_each
for_each(v.begin(), v.end(), myPrint01);
cout << endl;
//方法3:访问v容器 lambda表达式
//[]表示函数名 ()参数列表 {}函数体
for_each(v.begin(), v.end(), [](int val) {
cout << val << " ";
});
}