C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_概述例子程序

本文详细介绍了C++标准模板库(STL)中的各种容器类型,包括序列式容器如vector、deque、array、list等,关联式容器如set、multiset、map、multimap,以及无序容器如unordered_multiset和unordered_map。通过具体示例展示了每种容器的基本用法和特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是上一篇博文的配套的例子,也是原书上的例子。

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值