这是上一篇博文的配套的例子,也是原书上的例子。
// STL_AllConTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <vector>
#include <deque>
#include <array>
#include <list>
#include <forward_list>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
using namespace std;
int main()
{
//一、序列式容器 Sequence Containers
//1--vector(C++ 里vector不翻译为好—译成“向量”也可以,很多大佬都认为vector这个名字起错了)的使用演示如下:
vector <int> vec_coll;//vector for int elements
//append elements with 1---6
cout << "***--VectorSample--:append elements with 1---6 and print out***" << endl;
for (int i = 1; i <= 6; ++i) {
vec_coll.push_back(i);//用 push_back()来添加新的元素
}
//print
for (int i = 0; i <vec_coll.size(); ++i) {//size() 返回容器的元素的个数
//vec_coll.push_back(i);
cout << vec_coll[i] << ' ';//可以通过下标来访问元素
}
cout << endl;
//2--deque (双端队列)演示:
deque<float> deque_coll;//deque for floating-point elements
//insert 1.1---6.6 at the front
cout << "***--DequeSample--:push_front 1.1---6.6 to the front and print out***" << endl;
for (int i = 1; i <= 6; ++i) {
deque_coll.push_front(i*1.1);//用 push_front()来在前端添加新的元素
}
//print
for (int i = 0; i < deque_coll.size(); ++i) {//size() 返回容器的元素的个数
//vec_coll.push_back(i);
cout << deque_coll[i] << ' ';//可以通过下标来访问元素
}
cout << endl;
//测试:往后端添加元素
cout << "***--DequeSample--:push_back 1*1.9---6*1.9 to the end and print out***" << endl;
for (int i = 1; i <= 6; ++i) {
deque_coll.push_back(i * 1.9);//用 push_back()来在后端添加新的元素
}
//print
for (int i = 0; i < deque_coll.size(); ++i) {//size() 返回容器的元素的个数
cout << deque_coll[i] << ' '; //可以通过下标来访问元素
}
cout << endl;
//3--Array(数组)演示:(这里的array就是有固定大小的C array)
//array container of 5 string elements
array<string, 5> array_coll = { "hello","world" };
array<int, 5> array_int_coll = { 1,10,100,1000,10000 };
array<int, 5> array_int_coll2 = { 1,10,100,1000};//这个只初始化了四个,看看会打印出什么?
//print string array ,我们发现第3、4、5 个元素都初始化为了空字符串
cout << "***--ArraySample--:define a string array and print out***" << endl;
for (int i = 0; i < array_coll.size(); ++i) {//size() 返回容器的元素的个数
cout <<i<<" :"<< array_coll[i] << endl ;//可以通过下标来访问元素
}
//print int array
cout << "***--ArraySample--:define a int array and print out***" << endl;
for (int i = 0; i < array_int_coll.size(); ++i) { //size() 返回容器的元素的个数
cout << i << " :" << array_int_coll[i] << endl;//可以通过下标来访问元素
}
//print int array,我们发现第五个元素被初始化了 0
cout << "***--ArraySample--:define a int array and print out***" << endl;
for (int i = 0; i < array_int_coll2.size(); ++i) {//size() 返回容器的元素的个数
cout << i << " :" << array_int_coll2[i] << endl;//可以通过下标来访问元素
}
//4--以下演示list的使用,list 就是双向链表
list<char> list_coll;//list container for character elements
//append elements from a --z
cout << "***--ListSample--:define a list and push_back a---z to it and use range-based for loop to print out***" << endl;
cout << "***--ListSample--:对于list不能使用[],这是因为list并不提供随机访问,因此操作符[]会带来低效率***" << endl;
for (char c = 'a'; c <= 'z'; ++c) {
list_coll.push_back(c);
}
//print all elements
//-use range-based for loop
for (auto elem : list_coll) {
cout << elem << ' ';
}
cout << endl;
//list并不能用[]来进行访问。下面的语句是通不过编译器的,list_coll[i]根本就找不到这个元素,
/* for (int i; i < list_coll.size(); ++i) {
cout << list_coll[i] << ' ';
} */
//可以将elem声明为非常量的引用的方式来对list中的元素进行修改,以下完美地实现了小写的转换为大写的。a 97,A 65
cout << "***--ListSample--:可以将elem声明为非常量的引用的方式来对list中的元素进行修改***" << endl;
for (auto& elem : list_coll) {
elem = elem-32;
cout << elem << ' ';
}
cout << endl;
//下面演示的是用迭代器来打印出元素
cout << "***--ListSample--:用迭代器来打印出元素:print all the element with iterator pos:***" << endl;
list<char>::const_iterator pos;
for (pos = list_coll.begin(); pos != list_coll.end(); ++pos) {
cout << *pos << ' ';
}
cout << endl;
//5--forward_list 它是一种受限的list。
forward_list <long> forward_list_coll = { 2,3,5,7,11,13,17 };
//resize two times
// note:poor performance
forward_list_coll.resize(9);//resize 可以改变元素的个数,如果数量是增长的,还可以指定新元素的值
forward_list_coll.resize(10, 99);//如果参数Newsize大于原来的size,就是数量增长了,可以带有第二个参数:新的值
//print all elements
cout << " ***--ForwardlistSample--:forward_list 它是一种受限的list***" << endl;
for (auto temp : forward_list_coll)
{
cout << temp <<" ";
}
cout << endl;
//二、关联式容器 AssociativeContainers 二叉树来实现,左子树比自己小,右子树比自己大
//1、set 和multiset实例
//原书中只有multiset实例,set实例是博主自己补充的
//以下是 set 例子 主要代码都是一样的
set<string> cities{
"Braunschweig","Hanover","Frankfurt","New York","Chicago","Toronto","Paris","Frankfurt"
};
//print,这些城市都经过了排序,
cout << " ***--SetSample--:set就是集合,不允许出现重复数据***" << endl;
for (const auto& elem : cities) {
cout << elem << " ";
}
cout << endl;
//insert additional values
cities.insert({ "London","Munich","Hanover","Braunschweig" });
//print ,你会发现这些城市都经过了排序,而且不允许重复出现。
cout << "***--SetSample--:添加了新的城市, 而且新添加的数据和原来的数据存在数据重复:我们发现并没有重复数据的出现***" << endl;
for (const auto& elem : cities) {
cout << elem << " ";
}
cout << endl;
//以下是multi_set 例子 主要代码都是一样的
multiset<string> cities_multi{
"Braunschweig","Hanover","Frankfurt","New York","Chicago","Toronto","Paris","Frankfurt"
};
cout << "***--MultiSetSample--:MultiSet允许出现重复数据***" << endl;
//print,你会发现这些城市都经过了排序,
for (const auto& elem : cities_multi) {
cout << elem << " ";
}
cout << endl;
//insert additional values
cities_multi.insert({ "London","Munich","Hanover","Braunschweig" });
//print ,你会发现这些城市都经过了排序,而且允许重复出现。
cout << "***--MultiSetSample--::新增数据后,允许存在重复的数据***" << endl;
for (const auto& elem : cities_multi) {
cout << elem << " ";
}
cout << endl;
//2--map 和multimap
multimap<int, string> multimap_coll;//container for int/string key/values
//insert some elements in arbitrary order
//-a value with key 1 get inserted twice
multimap_coll = {
{5,"tagged"},
{2,"a"},
{1,"this"},
{4,"of"},
{6,"strings"},
{1,"is"},
{3,"multimap"}
};
//print :,你会发现这些pair 都经过了排序,按照key排序,this 的key是1,排在最前面,
//this 和is 的key都是1 ,这样C++11之前this和is的排列有可能是不同的。
cout << "***--MultiMapSample--::pair 都经过了排序,按照key排序。this 和is 的key都是1 ,C++11之前this和is的排列有可能是不同的***" << endl;
for (auto elem : multimap_coll) {
cout << elem.second << ' ';
}
cout << endl;
//三、无序容器:以hash table来实现 内部是一个由linked list组成的array,通过某个hash函数来运算,确定元素在array中的位置,这就是个袋子 ,里面啥都装啊
//1--1unordered multiset
unordered_multiset<string> unordered_cities{
"Braunschweig","Hanover","Frankfurt","New York","Chicago","Toronto","Paris","Frankfurt"
};
cout << "***--Unordered_MultiSetSample--:数据没有进行排序unordered***" << endl;
//print,你会发现这些城市都没有排序,顺序你也预测不到
for (const auto& elem : unordered_cities) {
cout << elem << " ";
}
cout << endl;
//insert additional values
unordered_cities.insert({ "London","Munich","Hanover","Braunschweig" });
//print
cout << "***--Unordered_MultisetSample--:新增数据后,仔细查看,会发现数据的存放都是无序的***" << endl;
for (const auto& elem : unordered_cities) {
cout << elem << " ";
}
cout << endl;
//2--unordered map multimap
unordered_map<string, double> unordered_map_coll{
{"tim",9.9},
{"struppi",11.77},
{"aidot",8},
{"YaSe",12},
};
//square each element
for (pair<const string, double>& elem : unordered_map_coll) {
elem.second *= elem.second;
}
//print
cout << "***--Unordered_MapSample--:数据从存放是混乱的***" << endl;
for (const auto& elem : unordered_map_coll) {
cout << elem.first<<": "<<elem.second<<endl;
}
}