c++初级 之 标准模板库(STL)

STLStandard Template Library,标准模板库),可以理解为系统事先写好的模板类和模板函数,我们直接用就行。具体的理解可以参考:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html

以下是简单例子:

向量(vector) 连续存储的元素<vector>

列表(list)       由节点组成的双向链表,每个结点包含着一个元素<list>

映射(map) {键,值}对组成的集合,以某种作用于键对上的谓词排列 <map>


#include<iostream>
#include<stdlib.h>
#include<vector>//它们属于标准模板库(STL,可以理解为系统预先写好的模板类),也可以称它们为容器(用于存储一些变量),这是三种不同的容器vector(向量)、list(链表)、map(映射)
#include<list>
#include<map>
#include<numeric>//定义了一些STL的算法函数
#include<string>//用到了string类型
using namespace std;

int main()
{
//初始化vector
	vector<int>arr(10,9);//10个9
	arr[0] = 1;
	cout << arr[0] << endl;//用脚标方式修改和打印元素值
	arr.push_back(8);//在尾部添加一个元素8
	cout << arr[10] << endl;
	cout << arr.size() << endl;//返回向量中的元素总个数
	arr.pop_back();//去除尾部一个元素
	//arr.pop_front();//vector没有popfront和pushfront但是list有
	cout << arr.size() << endl;
	cout << arr.front() << endl;//返回第一个元素
	cout << arr.back() << endl;//返回最后一个元素
    //使用脚标(索引)来遍历
	for(vector<int>::size_type i = 0;i != arr.size();i ++){//也可以写int i = 0,但有的容器sizetype并不是int,比如list,所以还是用size_type类型定义好
		cout << arr[i];
	}
    //使用迭代器遍历
	//const vector<int>::iterator ite = arr.begin();//被const修饰,表示ite是迭代器(iterator)常量,本身ite不可以改变。但是*ite还是可以变的
	vector<int>::iterator ite = arr.begin();//begin返回的是指向向量第一个元素的迭代器
	for(;ite != arr.end();ite ++){//end返回的是指向向量最后一个元素的下一个元素(实际不存在也无法访问)的迭代器,一般作为向量结束的标志使用
		*ite = 0;//有点类似指针,取迭代器指向的元素的值。
	}

	
	vector<int>::const_iterator conite = arr.begin();//conite是常迭代器(const_iterator),意思是它本身ite可以改变,但是*ite不可改变(无法改变容器vector里的值)
	for(;conite !=arr.end();conite++){
		cout << *conite;
	}
	arr.clear();//清空
	cout << arr.size() << endl;

//初始化list
	list<int> list1;//空链表
	list1.push_back(2);//list有很多和vector的函数同名同功能的函数。
	list1.push_front(1);
	//使用迭代器访问
	list<int>::iterator lite = list1.begin();
	lite ++;
	list1.insert(lite,3,9);//在lite所指的元素的前面插入3个9
	cout << list1.size() << endl;
	//求和
	lite = list1.end();
	lite--;
	lite--;
	cout << accumulate(list1.begin(),lite,1) << endl;//accumulate包含在numeric头文件里,求的是[迭代器,另一个迭代器)(包括前一个迭代器指向的值,不包括后一个的)所有的值再加上第三个参数(可以看成和的初值)的总和。
	//cout << list1[0] << endl;//报错,list不能用脚标形式访问。但是所有容器都可以用迭代器访问其中元素
	lite = list1.begin();
	for(;lite != list1.end();lite++){
		cout << *lite;
	}
	list1.pop_front();
	lite = list1.begin();
	for(;lite != list1.end();lite++){
		cout << *lite;
	}
	list1.clear();
	cout << list1.size() << endl;

//初始化map
	map<char,string>m;//由char作为键key映射到string作为值value
	pair<char,string>p1('Z',"zeal");
	pair<char,string>p2('B',"Bae");
	pair<char,string>p3('C',"Candy");
	//m.push_back(p1);//报错,map没有pushbackpoback这些函数
	m.insert(p1);
	m.insert(p2);
	m.insert(p3);//是往前插入的
	cout << m['Z'] << endl << m['B'] << endl;//用索引方式访问,[]中是x的值
	//用迭代器访问
	map<char,string>::iterator mite = m.find('Z');//find返回键‘Z’的对应映射的迭代器。
	for(;mite != m.end();){//这里不能再mite++
		//cout << *mite << endl;//*mite是一个pair类对象,不能直接输出
		cout << mite->first << endl << mite->second << endl;
		mite = m.erase(mite);//删除mite所指的那组映射并把erase的返回值赋给迭代器mite
		                    //注意,当执行完erase后,原来的迭代器就失效了,其行为是不可预测的。而erase操作会返回下一个迭代器
		                    //在这里就是m.end()了,所以将返回值赋给mite,且不能再执行mite++的操作,否则报iterator not incrementable的错
	}//因为是往前插入,所以是储存是ccandy、bbae、zzeal,所以只输出了zzeal
	m.erase('C');//删除键为‘C’的那個映射
	mite = m.begin();
	for(;mite != m.end();mite++){
		cout << mite->first << endl << mite->second << endl;
	}
    //清空
	m.clear();
	cout << m.size() << endl;

	system("pause");
	return 0;
}

运行结果:



猜你喜欢

转载自blog.csdn.net/zealice/article/details/77915943
今日推荐