C++高级之Map和自定义多元谓词

1、map

键值对形式的数据结构

  • insert方式插入
    key不不能重复,并且默认按照key从小到大排序
    map map;
    map.insert(make_pair(40, "32"));
    map.insert(make_pair(10, "10"));
    map.insert(make_pair(10, "11"));
    map.insert(make_pair(10, "12"));
    map.insert(make_pair(30, "30"));
    map.insert(make_pair(20, "30"));
    map.insert(make_pair(20, "31"));
    map.insert(make_pair(30, "22"));
    map.insert(make_pair(30, "32"));
    for (auto it = map.begin(); it != map.end(); it++) {
        cout<first<<" "<second<
10 10
20 30
30 30
40 32
  • [ ]方式赋值
    相同key会覆盖、默认也是从小到大排序
    map map;
    map[10] = "10";
    map[10] = "15";
    map[20] = "20";
    map[15] = "15";

    for (auto it = map.begin(); it != map.end(); it++) {
        cout<first<<" "<second<
10 15
15 15
20 20

  • find函数获取指定key对应的元素
    map map;
    map[10] = "10";
    map[10] = "15";
    map[20] = "20";
    map[15] = "15";
    auto it = map.find(20);
    cout << it->first << " " << it->second << endl;
20 20

  • multimap
    key可以重复,并且按照key进行分组排序
    map.insert(make_pair(40, "32"));
    map.insert(make_pair(10, "10"));
    map.insert(make_pair(10, "11"));
    map.insert(make_pair(10, "12"));
    map.insert(make_pair(30, "30"));
    map.insert(make_pair(20, "30"));
    map.insert(make_pair(20, "31"));
    map.insert(make_pair(30, "22"));

    for (auto it = map.begin(); it != map.end(); it++) {
        cout<first<<" "<second<
10 10
10 11
10 12
20 30
20 31
30 30
30 22
40 32

2、谓词(仿函数)

class ComPareObject{
public:
    void operator()(){
        cout<<"仿函数"<
仿函数
普通函数  

3、自定义谓词(仿函数)

  • 自定义谓词实现foreach遍历
class ComPare {
public:
    void operator()(int item) {
        cout << "遍历结果:" << item << endl;
    }
};

int main() {
    set sets;
    sets.insert(20);
    sets.insert(50);
    sets.insert(10);
    sets.insert(88);
    sets.insert(9);
    auto begintIt = sets.begin();
    auto endIt = sets.end();
    for_each(begintIt, endIt,ComPare());
}
遍历结果:9
遍历结果:10
遍历结果:20
遍历结果:50
遍历结果:88
  • 使用普通函数遍历
void forEach(int item){
    cout << "遍历结果:" << item << endl;
}

int main() {
    set sets;
    sets.insert(20);
    sets.insert(50);
    sets.insert(10);
    sets.insert(88);
    sets.insert(9);
    auto begintIt = sets.begin();
    auto endIt = sets.end();
    for_each(begintIt, endIt,forEach);
}
遍历结果:9
遍历结果:10
遍历结果:20
遍历结果:50
遍历结果:88
  • for_each源码分析
  template
    _GLIBCXX20_CONSTEXPR
    _Function
    for_each(_InputIterator __first, _InputIterator __last, _Function __f)
    {
      // concept requirements
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_requires_valid_range(__first, __last);
      for (; __first != __last; ++__first)
    __f(*__first);
      return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.
    }

需要三个参数,第一二个参数分别是迭代器首尾,而第三个参数则需要一个Function,可以理解成需要传入一个函数。接着下面其实几是通过迭代器++然后调用传过来的function。有点类似Kotlin中的高阶函数。

4、自定义多元谓词

仿函数中有一个参数称一元谓词,多个参数称为多元谓词

  • 通过自定义多元谓词实现比较器排序
class ComPare {
public:
    //二元谓词
    bool operator()(int _x, int _y) {
        return _x > _y;
    }
};
int main() {
    set sets;
    sets.insert(20);
    sets.insert(50);
    sets.insert(10);
    sets.insert(88);
    sets.insert(9);
    for (auto it = sets.begin(); it != sets.end(); it++) {
        cout << *it << endl;
    }
}
88
50
20
10
9

5、对象在容器中的生命周期变化

class Student {
public:
    int age;
    string name;

    Student(int age, string name) {
        this->age = age;
        this->name = name;
    }

    Student(const Student &student) {
        cout << "拷贝构造函数" << endl;
        this->age = student.age;
        this->name = student.name;
    }

    ~Student() {
        cout << "析构函数" << endl;
    }

};


int main() {
    Student student(18, "小红");
    vector v;
    //执行一次拷贝构造函数,把对象拷贝到容器
    v.insert(v.begin(), student);
    student.age = 20;
    cout << "student的值:" << student.age << student.name << endl;
    //执行一次拷贝构造函数,把容器对象拷贝出来
    Student student2 = v.front();
    cout << "student2的值:" << student2.age << student2.name << endl;
    //弹栈的时候,会弹出 student student2 以及容器总的student,所以调用三次析构函数
}
拷贝构造函数
student的值:20小红
拷贝构造函数
student2的值:18小红
析构函数
析构函数
析构函数

6、 C++ 预定义函数

C++的一些内置函数

    plus add_func;
    plus add_func2;

    int value = add_func(1,3);
    string value2 = add_func2("1","2");
    cout << value<<"-----"<
4-----12

你可能感兴趣的:(C++高级之Map和自定义多元谓词)