c++进阶-STL函数对象和谓词
2019-03-12 本文已影响0人
Peakmain
Map容器的介绍和使用
- 添加数据,一共四种方式,第一种和第四种最常用。
- 查找数据find
#include<map>
using namespace std;
void main(){
//map会对key进行排序,二叉树的算法
map<int, string> map1;
//添加数据
//第一种方式
map1.insert(pair<int, string>(1, "peakmain1"));
//第二种方式
map1.insert(make_pair(2, "peakmain2"));
//第三种方式
map1.insert(map<int, string>::value_type(3, "peakmain3"));
//第四种方式
map1[4] = "peakmain4";
map1[0] = "peakmain0";
//循环,迭代器
for (map<int, string>::iterator it = map1.begin(); it != map1.end(); it++){
cout << it->first << "==" << it->second.c_str()<<endl;
}
cout << "-------------------------------循环遍历结束-------------------------------" << endl;
//查找
map<int,string>::iterator find_it=map1.find(55);
if (find_it != map1.end()){
cout << find_it->first << "==" << find_it->second.c_str() << endl;
}
else{
cout << "找不到" << endl;
}
getchar();
}
添加数据的四种方式的区别:前面三种方式,key重复的话不生效,值不会改变,而第四种方式值会被覆盖
multimap的使用:允许键值重复
void main(){
multimap<int, string>map;
map.insert(pair<int, string>(01, "01"));
map.insert(pair<int, string>(01, "02"));
map.insert(pair<int, string>(01, "03"));
map.insert(pair<int, string>(02, "21"));
map.insert(pair<int, string>(02, "22"));
map.insert(pair<int, string>(02, "23"));
map.insert(pair<int, string>(03, "33"));
map.insert(pair<int, string>(03, "34"));
map.insert(pair<int, string>(03, "35"));
//遍历
for (multimap<int, string>::iterator it = map.begin(); it != map.end(); it++){
cout << it->first << "==" << it->second.c_str() << endl;
}
cout << "-------------------------------循环遍历结束-------------------------------" << endl;
//分组查询
multimap<int,string>::iterator find_it= map.find(1);
//分组遍历
while (find_it != map.end()){
cout << find_it->first << "==" << find_it->second.c_str() << endl;
find_it++;
if (find_it==map.end()||find_it->first != 1){
break;
}
}
getchar();
}
容器对象拷贝函数
c++中会调用对象的拷贝构造函数,存进去的是另一个对象
存在的错误:析构函数可能会调用多次,如果说在析构函数中释放内存,需要在浅拷贝构造函数中进行深拷倍
class Person{
public:
string name;
public:
Person(string name){
this->name = name;
}
void setName(string name){
this->name = name;
}
Person(const Person &person) {
cout << "拷贝构造函数" << endl;
}
};
//容器对象拷贝函数
void main(){
vector<Person> vector1;
Person person1("peakmain1");
vector1.push_back(person1);
//值并没有改变
person1.setName("Trasure");
Person person = vector1.front();
cout << person.name.c_str() << endl;
getchar();
}
普通函数和仿函数
class Compare
{
public:
//重载了括号运算符
void operator()(){
cout << "仿函数" << endl;
}
};
void compare1(){
cout << "普通函数" << endl;
}
void main(){
Compare compare;
//仿函数
compare();
//普通函数
compare1();
getchar();
}
仿函数,一元谓词(能够记录状态)
#include<algorithm>//预定义的函数和实现好的算法头文件
class Person{
public:
int count;
public:
void operator()(int number){
cout << number << endl;
count++;
}
};
void main(){
set<int> set1;
set1.insert(5);
set1.insert(100);
set1.insert( 90);
set1.insert(80);
//for_each迭代器:非常重要的一点,仿函数要保持记录状态,要确保对象一致,可以用返回值
//for_each(set1.begin(), set1.end(), print);
Person person;
person=for_each(set1.begin(), set1.end(), person);
cout << "次数:"<<person.count << endl;
getchar();
}
二元谓词
class Constans{
public:
int count;
public:
//两个参数
bool operator()(const string str1, const string str2){
return str1 < str2;
}
};
void main(){
//二元谓词的函数
set<string,Constans> set1;
set1.insert("aaa");
set1.insert("bbbb");
set1.insert("ccc");
set1.insert("dddd");
set1.insert("ee");
for (set < string>::iterator it = set1.begin(); it != set1.end(); it++){
cout << (*it).c_str() << endl;
}
getchar();
}