c++进阶-STL函数对象和谓词

2019-03-12  本文已影响0人  Peakmain

Map容器的介绍和使用

#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();
}
上一篇下一篇

猜你喜欢

热点阅读