第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;
}