第01节:STL基础

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <set>
#include <stack>
#include <queue>
using namespace std;int main()
{vector<int> vector1, vector2;list<int> list1, list2;deque<int> deque1, deque2;set<int> set1, set2;multiset<int> multiset1, multiset2;stack<int> stack1, stack2;queue<int> queue1, queue2;cout << "Vector: " << endl;vector1.push_back(1);vector1.push_back(2);vector2.push_back(30);cout << "size of vector1: " << vector1.size() << endl;cout << "size of vector2: " << vector2.size() << endl;cout << "maximum size of vector1: " << vector1.max_size() << endl;cout << "maximum size of vector2: " << vector2.max_size() << endl;vector1.swap(vector2);cout << "size of vector1: " << vector1.size() << endl;cout << "size of vector2: " << vector2.size() << endl;cout << "vector1 < vector2? " << (vector1 < vector2)<< endl << endl;cout << "List: " << endl;list1.push_back(1);list1.push_back(2);list2.push_back(30);cout << "size of list1: " << list1.size() << endl;cout << "size of list2: " << list2.size() << endl;cout << "maximum size of list1: " << list1.max_size() << endl;cout << "maximum size of list2: " << list2.max_size() << endl;list1.swap(list2);cout << "size of list1: " << list1.size() << endl;cout << "size of list2: " << list2.size() << endl;cout << "list1 < list2? " << (list1 < list2) << endl << endl;cout << "Deque: " << endl;deque1.push_back(1);deque1.push_back(2);deque2.push_back(30);cout << "size of deque1: " << deque1.size() << endl;cout << "size of deque2: " << deque2.size() << endl;cout << "maximum size of deque1: " << deque1.max_size() << endl;cout << "maximum size of deque2: " << deque2.max_size() << endl;deque1.swap(deque2);cout << "size of deque1: " << deque1.size() << endl;cout << "size of deque2: " << deque2.size() << endl;cout << "deque1 < deque2? " << (deque1 < deque2) << endl << endl;cout << "Set: " << endl;set1.insert(1);set1.insert(1);set1.insert(2);set2.insert(30);cout << "size of set1: " << set1.size() << endl;cout << "size of set2: " << set2.size() << endl;cout << "maximum size of set1: " << set1.max_size() << endl;cout << "maximum size of set2: " << set2.max_size() << endl;set1.swap(set2);cout << "size of set1: " << set1.size() << endl;cout << "size of set2: " << set2.size() << endl;cout << "set1 < set2? " << (set1 < set2) << endl << endl;cout << "Multiset: " << endl;multiset1.insert(1);multiset1.insert(1);multiset1.insert(2);multiset2.insert(30);cout << "size of multiset1: " << multiset1.size() << endl;cout << "size of multiset2: " << multiset2.size() << endl;cout << "maximum size of multiset1: " <<multiset1.max_size() << endl;cout << "maximum size of multiset2: " <<multiset2.max_size() << endl;multiset1.swap(multiset2);cout << "size of multiset1: " << multiset1.size() << endl;cout << "size of multiset2: " << multiset2.size() << endl;cout << "multiset1 < multiset2? " <<(multiset1 < multiset2) << endl << endl;cout << "Stack: " << endl;stack1.push(1);stack1.push(1);stack1.push(2);stack2.push(30);cout << "size of stack1: " << stack1.size() << endl;cout << "size of stack2: " << stack2.size() << endl;cout << "stack1 < stack2? " << (stack1 < stack2) << endl << endl;cout << "Queue: " << endl;queue1.push(1);queue1.push(1);queue1.push(2);queue2.push(30);cout << "size of queue1: " << queue1.size() << endl;cout << "size of queue2: " << queue2.size() << endl;cout << "queue1 < queue2? " << (queue1 < queue2) << endl << endl;return 0;
}


第03节:STL迭代器

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;int main()
{vector<int> intVector;intVector.push_back(10);intVector.push_back(40);intVector.push_back(50);intVector.push_back(20);intVector.push_back(30);vector<int>::reverse_iterator p1;cout << "逆序遍历: ";for (p1 = intVector.rbegin(); p1 != intVector.rend(); p1++){cout << *p1 << " ";}vector<int>::iterator p2;sort(intVector.rbegin(), intVector.rend());cout << "\n从大到小排序" << endl;for (p2 = intVector.begin(); p2 != intVector.end(); p2++){cout << *p2 << " ";}set<int> intSet; //keyintSet.insert(10);intSet.insert(40);intSet.insert(50);intSet.insert(20);intSet.insert(30);set<int>::iterator p3;cout << "\nTranverse the set: ";for (p3 = intSet.begin(); p3 != intSet.end(); p3++){cout << *p3 << " ";}cout << endl;return 0;
}


#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> intVector;intVector.push_back(10);intVector.push_back(20);intVector.push_back(30);intVector.push_back(40);intVector.push_back(50);intVector.push_back(60);vector<int>::iterator p1 = intVector.begin();for (; p1 != intVector.end(); p1++){cout << *p1 << " ";}cout << endl << *(--p1) << endl;cout << *(p1 - 3) << endl;cout << p1[-3] << endl;*p1 = 1234;cout << *p1 << endl;return 0;
}

第04节:容器的更多用法


VectorDemo.cpp

#include <iostream>
#include <vector>
using namespace std;int main()
{double values[] = {1, 2, 3, 4, 5, 6, 7};// 构造向量,用迭代器[beg, end)间的元素初始化向量 vector<double> doubleVector(values, values + 7);cout << "Initial contents in doubleVector: ";for (int i = 0; i < doubleVector.size(); i++)cout << doubleVector[i] << " ";// 顺序容器:assign(n, elem) 将n份元素拷贝赋值给容器 doubleVector.assign(4, 11.5);cout << "\nAfter the assign function, doubleVector: ";for (int i = 0; i < doubleVector.size(); i++)cout << doubleVector[i] << " ";// vector/deque中特有的函数at(index)返回指定位置的元素 doubleVector.at(0) = 22.4;cout << "\nAfter the at function, doubleVector: ";for (int i = 0; i < doubleVector.size(); i++)cout << doubleVector[i] << " ";// 定义迭代器,令其指向向量首位置 vector<double>::iterator itr = doubleVector.begin();// 顺序容器:insert(position, elem) 将元素插入指定位置 doubleVector.insert(itr + 1, 555);// !!!警告!!! 调用vector的insert之后,所有的迭代器都【可能】失效! //doubleVector.insert(itr + 1, 666);  // itr可能会失效itr = doubleVector.begin();doubleVector.insert(itr + 1, 666);cout << "\nAfter the insert function, doubleVector: ";for (int i = 0; i < doubleVector.size(); i++)cout << doubleVector[i] << " ";// 一级容器: erase(beg, end) 删除指定迭代器范围的元素 doubleVector.erase(itr + 2, itr + 4);//!!!警告!!! 调用vector的erase之后,beg及之后的迭代器都会失效!cout << "\nAfter the erase function, doubleVector: ";for (int i = 0; i < doubleVector.size(); i++)cout << doubleVector[i] << " ";doubleVector.clear();cout << "\nSize is " << doubleVector.size() << endl;cout << "Is empty? " <<(doubleVector.empty() ? "true" : "false") << endl;return 0;
}


ListDemo.cpp

#include <iostream>
#include <list>
using namespace std;int main()
{int values[] = {1, 2, 3, 4 };// 构造list,用迭代器[beg, end)间的元素初始化list list<int> intList(values, values + 4);cout << "Initial contents in intList: ";list<int>::iterator p; // list的迭代器为双向迭代器 for (p = intList.begin(); p != intList.end(); p++)cout << *p << " ";// 顺序容器:assign(n, elem) 将n份元素拷贝赋值给容器 intList.assign(4, 11);cout << "\nAfter assign, intList: ";for (p = intList.begin(); p != intList.end(); p++)cout << *p << " ";list<int>::iterator itr = intList.begin();itr++;  // 迭代器指向第2个11:  11  ^11  11  11 // 顺序容器:insert(position, elem) 将元素插入指定位置 intList.insert(itr, 555); // 11  555  ^11  11  11 // 调用list的insert之后,迭代器不受影响,仍指向第2个11 intList.insert(itr, 666); // 11  555  666  ^11  11  11cout << "\nAfter insert, intList: ";for (p = intList.begin(); p != intList.end(); p++)cout << *p << " ";list<int>::iterator beg = intList.begin();itr++;// 一级容器: erase(beg, end) 删除指定迭代器范围的元素 intList.erase(beg, itr);// !!!警告!!! 被删除元素的迭代器均失效,其它元素迭代器仍有效 cout << "\nAfter erase, intList: ";for (p = intList.begin(); p != intList.end(); p++)cout << *p << " ";intList.clear();cout << "\nAfter clear, intList: ";cout << "Size is " << intList.size() << endl;cout << "Is empty? " <<(intList.empty() ? "true" : "false");// deque/list特有:push_front(elem)将元素插入列表首部 intList.push_front(10);intList.push_front(11);intList.push_front(12);cout << "\nAfter push, intList: ";for (p = intList.begin(); p != intList.end(); p++)cout << *p << " ";// deque/list特有:pop_front()删除列表首元素 intList.pop_front();// 顺序容器:pop_back()删除容器尾元素 intList.pop_back();cout << "\nAfter pop functions, intList: ";for (p = intList.begin(); p != intList.end(); p++)cout << *p << " ";int values1[] = {7, 3, 1, 2};list<int> list1(values1, values1 + 4);// list特有:sort() 将元素按升序排列 list1.sort();cout << "\nAfter sort, list1: ";for (p = list1.begin(); p != list1.end(); p++)cout << *p << " ";list<int> list2(list1);// list特有:merge(l2) 假定当前list与list2都已排序,//           将list2合并至本表,list2变空 list1.merge(list2);cout << "\nAfter merge, list1: ";for (p = list1.begin(); p != list1.end(); p++)cout << *p << " ";cout << "\nSize of list2 is " << list2.size();// list特有:reverse()反转本列表 list1.reverse();cout << "\nAfter reverse, list1: ";for (p = list1.begin(); p != list1.end(); p++)cout << *p << " ";list1.push_back(7);list1.push_back(1);cout << "\nAfter push, list1: ";for (p = list1.begin(); p != list1.end(); p++)cout << *p << " ";// list特有:remove(elem)删除表中与elem相等的元素 list1.remove(7);cout << "\nAfter remove, list1: ";for (p = list1.begin(); p != list1.end(); p++)cout << *p << " ";// 顺序容器:assign(n, elem) 将n份elem拷贝赋值给容器 list2.assign(7, 2);cout << "\nAfter assign, list2: ";for (p = list2.begin(); p != list2.end(); p++)cout << *p << " ";p = list2.begin();p++;// list特有:splice(pos,li)将li中所有元素移至本表pos位置之前//           然后li变空 list2.splice(p, list1);cout << "\nAfter splice, list2: ";for (p = list2.begin(); p != list2.end(); p++)cout << *p << " ";cout << "\nAfter splice, list1 size: "<< list1.size();return 0;
}


ListDemo.cpp

#include <iostream>
#include <deque>
using namespace std;int main()
{double values[] = {1, 2, 3, 4, 5, 6, 7};// 构造deque,用迭代器[beg, end)间的元素初始化deque  deque<double> doubleDeque(values, values + 7);cout << "Initial contents in doubleDeque: ";for (int i = 0; i < doubleDeque.size(); i++)cout << doubleDeque[i] << " ";// 顺序容器:assign(n, elem) 将n份元素拷贝赋值给容器 doubleDeque.assign(4, 11.5);cout << "\nAfter assign: ";for (int i = 0; i < doubleDeque.size(); i++)cout << doubleDeque[i] << " ";// deque/vector中特有:at(index)返回指定位置的元素 doubleDeque.at(0) = 22.4;cout << "\nAfter at: ";for (int i = 0; i < doubleDeque.size(); i++)cout << doubleDeque[i] << " ";deque<double>::iterator itr = doubleDeque.begin();// 顺序容器:insert(position, elem) 将元素插入指定位置 doubleDeque.insert(itr + 1, 555);// doubleDeque.insert(itr + 1, 666); // Error! Unexpected Behavior// !!!警告!!! 调用deque的insert之后,所有的迭代器都【必然】失效!//  itr = doubleDeque.begin(); // 重新获得迭代器 doubleDeque.insert(itr + 1, 666);cout << "\nAfter insert: ";for (int i = 0; i < doubleDeque.size(); i++)cout << doubleDeque[i] << " ";// 一级容器:erase(beg, end) 删除指定迭代器范围的元素doubleDeque.erase(itr + 2, itr + 4);// !!!警告!!! 调用deque的erase之后,所有的迭代器都【可能】失效!cout << "\nAfter erase: ";for (int i = 0; i < doubleDeque.size(); i++)cout << doubleDeque[i] << " ";doubleDeque.clear();cout << "\nAfter clear: ";cout << "Size is " << doubleDeque.size() << endl;cout << "Is empty? " <<(doubleDeque.empty() ? "true" : "false") << endl;// deque/list特有:push_front(elem)将元素压入队头 doubleDeque.push_front(10.10); // 10.10 doubleDeque.push_front(20.22); // 20.22 10.10doubleDeque.push_front(30.33); // 30.33 20.22 10.10cout << "After push_front: ";for (int i = 0; i < doubleDeque.size(); i++)cout << doubleDeque[i] << " ";// deque/list特有:pop_front()删除队首元素 doubleDeque.pop_front();// 顺序容器:pop_back()删除容器尾元素 doubleDeque.pop_back();cout << "\nAfter pop: ";for (int i = 0; i < doubleDeque.size(); i++)cout << doubleDeque[i] << " ";return 0;
}


#include <iostream>
#include <set>
using namespace std;int main()
{int values[] = {3, 5, 1, 7, 2, 2};// 构造multiset,用迭代器[beg, end)间的元素初始化deque // 升序排列  1,2,2,3,5,7 multiset<int> set1(values, values + 6);// 降序排列  7,5,3,2,2,1//  multiset<int, greater<int> > set1(values, values + 6);cout << "Initial contents in set1: ";multiset<int>::iterator p;for (p = set1.begin(); p != set1.end(); p++) // set支持双向迭代器 cout << *p << " ";set1.insert(555); // 1,2,2,3,5,7,555 set1.insert(1);   // 1,1,2,2,3,5,7,555cout << "\nAfter insert, set1: ";for (p = set1.begin(); p != set1.end(); p++)cout << *p << " ";p = set1.lower_bound(2); // p指向容器中第一个2 cout << "\nValue of Lower bound of 2: " << *p;p = set1.upper_bound(2); // p指向容器中最后一个2的后面 cout << "\nValue of Upper bound of 2: " << *p;p = set1.find(2);if (p == set1.end()) // 若迭代器指向set尾部,则未找到 cout << "2 is not in set1" << endl;elsecout << "\nThe number of 2: " << set1.count(2);set1.erase(2); // 将所有值为2的元素都删掉 cout << "\nAfter erase, set1: ";for (p = set1.begin(); p != set1.end(); p++)cout << *p << " ";return 0;
}

#include <iostream>
#include <map>
#include <string>
using namespace std;int main()
{map<int, string> map1;// 插入键值对 map1.insert(map<int, string>::value_type(100, "Zhang San"));map1.insert(map<int, string>::value_type(101, "Li Si"));map1.insert(map<int, string>::value_type(102, "Zhen Xiaosa"));map1.insert(map<int, string>::value_type(103, "Hao Meili"));cout << "Initial contents in map1:\n";map<int, string>::iterator p;for (p = map1.begin(); p != map1.end(); p++)cout << p->first << " " << p->second << endl;// 使用 first 访问 key; 使用 second 访问 value cout << "Enter a key to serach for the name: ";int key;cin >> key;p = map1.find(key);if (p == map1.end()) // 若迭代器指向map尾部,则未找到指定键 cout << "  Key " << key << " not found in map1";else    cout << "  " << p->first << " " << p->second << endl;map1.erase(103);cout << "\nAfter erase 103, map1:\n";for (p = map1.begin(); p != map1.end(); p++)cout << p->first << " " << p->second << endl;return 0;
}

#include <iostream>
#include <queue>
#include <list>
using namespace std;template<typename T>
void printQueue(T &queueRef)
{while (!queueRef.empty()) // 队列为空? {cout << queueRef.front() << " "; // 读队头元素 queueRef.pop(); // 删除队头 }
}int main()
{queue<int> queue1; // 基于deque实现 queue<int, list<int> > queue2; // 基于list实现 for (int i = 0; i < 8; i++){                 // tail ...... headqueue1.push(i); // 7,6,5,4,3,2,1,0queue2.push(i); // 7,6,5,4,3,2,1,0}cout << "Contents in queue1: ";printQueue(queue1);cout << "\nContents in queue2: ";printQueue(queue2);return 0;
}

#include <iostream>
#include <stack>
#include <vector>
using namespace std;template<typename T>
void printStack(T &stackRef)
{while (!stackRef.empty()){cout << stackRef.top() << " ";stackRef.pop();}
}int main()
{stack<int> stack1;stack<int, vector<int> > stack2;for (int i = 0; i < 8; i++){stack1.push(i);stack2.push(i);}cout << "Contents in stack1: ";printStack(stack1);cout << "\nContents in stack2: ";printStack(stack2);return 0;
}

崔毅东 C++程序设计入门(下) 第11单元:工欲善其事必先利其器 – 标准模板库相关推荐

  1. 崔毅东 C++程序设计入门(下) 第9单元:白公曾咏牡丹芳,一种鲜妍独“异常” 笔记

    第01节:概览异常 QuotientWithException.cpp #include <iostream> using namespace std;int main() {// Rea ...

  2. 崔毅东 C++程序设计入门(上) 第5单元:万类霜天竞自由 – 对象和类的更多内容 笔记

    第01节:不可变对象.不可变类:避免多次声明 Date1.h class Date { public:Date(int newYear, int newMonth, int newDay);//Dat ...

  3. C++入门到精通 ——第七章 STL标准模板库大局观

    七.STL标准模板库大局观 Author: XFFer_ 先分享一本 <C++ 标准库 第二版> ,望在STL的道路上从入门到放弃!(开玩笑的啦,愈行愈远~) 链接: https://pa ...

  4. Part10 泛型程序设计与C++标准模板库 10.1泛型程序设计及STL的结构

    1泛型程序设计的基本概念 泛型程序设计: 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数 ...

  5. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  6. C++ STL 标准模板库介绍与入门

    目录 1.概述 1.1.C++ 标准库 1.2.Boost库 2.STL 版本 2.1.HP 原始版本 2.2.P. J. 实现版本 2.3.RW 实现版本 2.4.SGI 实现版本 2.5.STLp ...

  7. 【跟学C++】C++STL标准模板库——算法详细整理(下)(Study18)

    文章目录 1.简介 2.STL算法分类及常用函数 2.2.变序算法(二) 2.2.1 替换算法(2个) 2.2.2 排序算法(6个) 2.2.3 分区算法(4个) 2.2.4 可用于排序容器的算法(3 ...

  8. 8、泛型程序设计与c++标准模板库2.4列表容器

    列表容器主要用于存放链表,其中的链表是双向链表,可以从任意一端开始遍历.列表容器是需要按顺序访问的容器.另外,列表容器不支持随机访问迭代器,因此某些算法不能适合于列表容器.列表容器还提供了另一种操作- ...

  9. Visual C++ 2008入门经典 第十章标准模板库(二)

    //10.4 关联容器 //关联容器(如map<K,T>)最重要的特性是无需搜索就可检索特定对像,关联容器内容T类型对像的位置由与对像一起提供的类型为K的键确定,因此只要提供适当的键就可以 ...

最新文章

  1. nginx 反向代理和负载均衡
  2. 各种抠图动态图片_学习抠取动物毛发图片的PS抠图技巧
  3. WiFi相关基础概念
  4. 梭子鱼邮件归档设备配置
  5. echarts画布_vue中动态设置echarts画布大小
  6. python事件触发机制_Python3-事件驱动、IO模型和触发方式
  7. 系列(七)—测试用例设计
  8. java源文件编译成jar_从源文件和JAR文件构建Java代码模型
  9. unity3d之控制人物转向移动并播放动画
  10. kettle的命名参数接口NamedParams实现与Job命名参数的传递和使用实现
  11. Python的迭代器
  12. C++ 编译期封装-Pimpl技术
  13. 利用计算机进行信息检索,用计算机进行情报检索属于计算机应用中的
  14. 2019最新领航Java机器人项目开发之人工智能项目实战(完整)
  15. GET和POST本质区别
  16. 深度学习,mxnet库的安装
  17. Thread多线程-(最容易被问到的面试题)
  18. 掠食细菌—蛭弧菌B. bacteriovorus,可以对抗革兰氏阴性感染?
  19. SAP UI5 SimpleForm 里在水平方向显示多组 Form 元素的实现方法试读版
  20. 数据分析的年度工作计划,这样制定才合理!

热门文章

  1. 03-----既上一篇往Gitlab推送已有项目(并且出现! [rejected] master -> master (fetch first)])
  2. 准确度(Accuracy)和精密度(Precision)
  3. SQLSERVER 批量删除表数据
  4. 如何在大众点评获取cookies【亲测有效】
  5. 选第二大元素python(分治)
  6. 一、SASS(SCSS)
  7. XFTP 7 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本”
  8. python爬取英雄联盟所有皮肤
  9. Fiber Optic Enclosure: What to Benefit From It?
  10. 前端无感刷新token