崔毅东 C++程序设计入门(下) 第10单元:月映千江未减明 – 模板 笔记

第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; //key
  intSet.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  11
  cout << "\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.10
  doubleDeque.push_front(30.33); // 30.33 20.22 10.10
  cout << "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,555
  cout << "\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;
  else
    cout << "\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 ...... head
    queue1.push(i); // 7,6,5,4,3,2,1,0
    queue2.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;
}

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dldldl1994/article/details/88078524