STL库
1、Vector
在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定。当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:
①vector 会申请一块更大的内存块;
②将原来的数据拷贝到新的内存块中;
③销毁掉原内存块中的对象(调用对象的析构函数);
④将原来的内存空间释放掉。
遍历方式:数组下标、迭代器遍历
1 int main() { 2 vector<int> vec; 3 vec.push_back(1); 4 vec.push_back(2); 5 vec.push_back(3); 6 7 cout << "向量的大小为" << vec.size() << endl; 8 9 //数组下标方式遍历 10 for (int i = 0; i < vec.size(); i++) { 11 cout << vec[i] << endl; 12 } 13 14 //迭代器遍历 15 vector<int>::iterator it = vec.begin(); 16 for (; it != vec.end(); it++) { 17 cout << *it<< endl; 18 } 19 system("PAUSE"); 20 return 0; 21 }
2、双向链表List
对于一个双向链表来说主要包括3个:指向前一个链表节点的前向指针、有效数据、指向后一个链表节点的后向指针
List VS Vector
优点:
①动态的分配内存,当需要添加数据的时候不会像vector那样,先将现有的内存空间释放,在次分配更大的空间,这样的话效率就比较低了。
②支持内部插入、头部插入和尾部插入
缺点:不能随机访问,不支持[]方式和vector.at()、占用的内存会多于vector(非有效数据占用的内存空间)
int main() { list<int> ll; //插入元素 ll.push_back(1);//尾部插入 ll.push_front(2);//头部插入 ll.insert(ll.begin(), 3);//开始位置插入 ll.insert(ll.end(), 4);//结束位置插入 cout << "链表是否为空" << ll.empty() << endl; cout << "list链表中元素个数" << ll.size() << endl; cout << "list链表第一个元素" << ll.front() << endl; cout << "list链表最后一个元素" << ll.back() << endl; //遍历链表 正向 cout << "正向" << ' '; list<int>::iterator it = ll.begin(); for (; it != ll.end(); it++) { cout << *it << ' '; } cout << endl; //遍历链表 逆向 cout << "逆向" << ' '; list<int>::reverse_iterator reit = ll.rbegin(); for (; reit != ll.rend();reit++) { cout << *reit << ' '; } cout << endl; //链表排序 cout << "链表排序" << ' '; ll.sort(); it = ll.begin(); for (; it != ll.end(); it++) { cout << *it << ' '; } cout << endl; //清楚容器中的所有元素 ll.clear(); cout << "清楚容器后链表的大小:" << ll.size() << endl; system("PAUSE"); return 0; }
运行结果
3、Map
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完全有可能在我们处理一对一数据的时候,在编程上提供快速通道。map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。
遍历方式:[键值],迭代器
int main() { map<int, string> m1 = { {1,"广州"},{2,"深圳"},{3,"长沙"} }; map<char, string> m2; pair<char, string> p1('G', "guangzhou"); pair<char, string> p2('S', "shenzhen"); pair<char, string> p3('C', "changsha"); m2.insert(p1); m2.insert(p2); m2.insert(p3); cout << "m1元素的个数为" << m1.size() << endl; cout << "m2元素的个数为" << m2.size() << endl; //采用[键值]方式打印数据 cout << m1[1] << endl; cout << m2['G'] << endl; //迭代器正向方式遍历 cout << "正向遍历m1:" << ' '; map<int, string>::iterator it = m1.begin(); for (; it != m1.end(); it++) { cout <<it->first<< ','; cout << it->second << ' '; } cout << endl; //迭代器反向方式遍历 cout << "反向遍历m1:" << ' '; map<int, string>::reverse_iterator reit = m1.rbegin(); for (; reit != m1.rend();reit++) { cout << reit->first << ','; cout << reit->second << ' '; } cout << endl; //清空容器 m1.clear(); m2.clear(); cout << "清空容器后m1元素的个数为" << m1.size() << endl; cout << "清空容器后m2元素的个数为" << m2.size() << endl; system("PAUSE"); return 0; }