知识点小结
最近刚刚把算法中的排序部分刷完,由此觉得在实际的应用中应该不会每次都要手写排序,于是查到了一些关于容器的知识。这里先小结一下set和map。这两个容器属于关联容器,底层实现是红黑树,有点类似于java中的hashmap。set只有键,而map同时拥有键和值。同时,set和map这两个关联容器还有自己的函数,如insert和erase等。还是先从简单的部分理解,目前我的最大感受是,如果可以使用这种容器,那么排序的部分就不用再手写了,但是如果是非基础类型,比如说是一个结构体,那么就需要定义排序方式,或者说比较大小的比较器。
另外,对于容器,迭代器的概念非常的重要。我目前比较肤浅的理解是迭代器相当于一个指向容器内元素的指针,可以用*来返回迭代器指向的内容。对于结构体,迭代器后面也可以跟->。下面来看实例代码。还有许多其他的函数没有出现在例子当中,大家用到的时候查询即可。
#include <iostream>
#include <set> // 有关set的操作都包含在<set>头文件中
#include <map> // 有关map 的操作都包含在<map>头文件中
using namespace std;
int main()
{
set<int> n; // 可以把set<int>看成某种数据类型,实际表示set里存放的是int类型的元素
n.insert(1); // insert是set的函数,用于向set类型的容器n增加元素
n.insert(3);
n.insert(5);
n.insert(2);
n.insert(4);
n.erase(3); // erase是set的函数,用于删除set类型的容器中的元素
set<int> :: iterator it; //这里it是set<int> 的迭代器
for(it=n.begin(); it!=n.end(); it++)
//begin 和 end都是set的函数,分别指向第一个元素,和最后一个元素的后一位
cout << *it << ' ';
//这里可以将it看成指针,*it即为迭代器it指向的元素的具体值
cout << endl;
map<string, int> student;
//map的insert的函数需要明确输入的数据类型
student.insert(pair<string,int> ("Alice", 1));
student["Bob"] = 2; //也可以使用数组进行初始化
student.insert(pair<string,int> ("Cary", 3));
map<string, int> :: iterator it2;
for(it2 = student.begin(); it2 != student.end(); it2++)
cout << it2 -> first << " " << it2 -> second << endl;
it2 = student.find("Alice"); //注意it2是指向键值对的一个指针
cout << it2 -> second << endl; //由于it2是指针,所以输出值时用second
return 0;
}