C++模板引出的标准模板库----->初涉

C++中模板,是相当重要的一部分,前面提到过一些基础,关于模板中需要注意的问题,会在最近整理出来,今天想说的,是由模板引出的标准模板库。

当初经常会被推荐看《STL源码剖析》这本书,听说很厉害,是C++高手都需要走过的路,可一直都不知道STL是什么,也一直忘记去查,今天整理出来的一些东西,最起码可以让未了解过这方面的童鞋认识一下。

C++标准模板库,即STL:Standard Template Lib,STL的产生,是必然的。在长期的编码过程中,一些程序员发现,有一些代码经常用到,而且需求特别稳定,于是,各大公司就在出售自己的IDE环境的同时,将这些代码打包一起销售,之后,这些大公司就达成共识,认为应该讲这部分代码进一步统一规范,于是,就形成了一套标准模板,也就慢慢演变成了现在的STL。

C++标准模板库是一个相当庞大的家族,今天,提到的是一些常用的部分,拿出来和大家分享。其他的使用方法,与今天要提到的这些都特别相似,很多程序员在开发项目的时候,都是随用随学。现在就进入今天的正题。

vector向量:头文件:#include<vector>

vector的本质是对数组的分装,可以认为它是一个数组,不过相对数组功能更强大,根据存储的元素个数,自动的变长或者缩短,特点:读取能在常数时间完成

在VS2013环境下,可以简单验证一下。

其中,size是该向量当中现有元素个数,capacity是该向量所能容纳最多数组元素

初始化vector对象的方式:

1、vector<T>v1----->保存类型为T的对象,默认v1为空向量

2、vector<T>v2(v1)----->用一个向量去初始化另外一个向量

3、vector<T> v3(n,i)----->v3包含n个值为i的元素,即v3中存储了n个i

4、vector<T> v4(n)----->v4包含了值初始化元素的n个副本

向量常用函数:

empty()----->判断向量是否为空<空返回true,非空返回fause>

begin()----->返回向量迭代器首元素

end()----->返回向量迭代器末元素的下一个元素

clear()----->清空向量

front()----->第一个数据

back()----->最后一个数据

size()----->获得向量中数据大小

push_back(elem)----->将数据插入向量尾

pop_back()----->删除向量尾部数据

既然说,向量是数组的封装,那么,无法避免的就要考虑到它的遍历问题。

向量遍历有两种方式:

一、按照数组形式遍历

for(int i = 0;i<vec.size;i++)

{

cout<<vec[k]<<endl;

}

二、使用迭代器

向量迭代器的定义方式如下:

vector<T>::iterator + 变量名  = vec.begin();  //可以理解为这个迭代器变量的类型为vector<T>::iterator,后面之所以要赋值vec.begin(),vec是我定义的向量名,是因为我们要完成遍历的目的。代码如下:

int main(void)

{

 vector<int>vec;

 vec.push_back(1);

 vec.push_back(2);

 vec.push_back(3);

 vec.push_back(4);

 vec.pop_back();

 //数组方法

 for (int i = 0; i < vec.size(); i++)

 {

  cout << vec[i] << endl;

 }

 //迭代器方法

 vector <int>::iterator pvec = vec.begin();

 for (; pvec != vec.end(); pvec++)

 {

  cout << *pvec << endl;

 }

 system("pause");

 return 0;

}

链表模板:list         头文件:#include<list>

特点:数据插入速度快

使用方法:与向量使用方法基本相同, 有push、insert、begin、end等函数,也可通过迭代器进行访问

值得注意的是,list不可以通过数组的方式进行访问

同样给出list遍历的代码,如下:

int main(void)
{
 list <int>list1;
 list1.push_back(1);
 list1.push_back(2);
 list1.push_back(3);
 list1.push_back(4);
 list<int>::iterator plist = list1.begin();
 for (; plist!= list1.end(); ++plist)
 {
  cout << *plist << endl;
 }
 system("pause");
 return 0;
}

映射模板:map          头文件:   #include<map>

map中键(key)与值(value)是一一对应的,即成对出现,通过关键字pair定义若干对key和value,再通过insert函数插入到map中。

用迭代器遍历map时,不可以对迭代器前加*直接访问

给出map遍历的代码,如下:

int main(void)

{

 map<int, string>m;

 pair <int, string>p1(1,"hello");

 pair <int, string>p2(2, "world");

 pair <int, string>p3(3, "zhou");

 m.insert(p1);//这里不可以用push_back

 m.insert(p2);

 m.insert(p3);

 cout << m.size() << endl;

 ////数组输出

 //for (int i = 0; i < m.size(); i++)

// {

//  cout << m[i] << endl;

// }

 //迭代器输出

 map<int, string>::iterator pmap = m.begin();

 cout << m.size() << endl;

 for (; pmap != m.end(); pmap++)

 {

  cout << pmap->first << endl;//first表示键

  cout << pmap->second << endl;//second表示值

  cout << endl;  

 }

 system("pause");

 return 0;

}

除此之外,ma元素的数组访问,和简单的数组也是有不同的,比如下面这段代码。

 map<string, string> m;

 pair<string, string> p1("A", "shanghai");

 pair<string, string> p2("B", "beijing");

 m.insert(p1);

 m.insert(p2);

 cout << m["A"] << endl;

 cout << m["B"] << endl;
时间: 2024-12-23 04:21:48

C++模板引出的标准模板库----->初涉的相关文章

标准模板库

-------------------siwuxie095 在长期的编码中,聪明的程序员们发现:有一些代码经常碰到, 而且需求特别稳定,于是,各大公司在出售自己的 IDE 环境时, 就会把这些模板代码打包,一起销售 慢慢地,这些大公司之间就达成了某种共识,觉得应该把这些 涉及模板的通用代码进一步的统一和规范,于是,大家慢慢形 成了一套 C++ 的标准模板,就是现在所看到的标准模板库 标准模板库 标准模板库,即 Standard Template Lib,简称为 STL 标准模板库所涉及的内容非常

C++标准库和标准模板库

C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义. 在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括: (1)成本:已经作为标准提供,何苦再花费时间.人力重新开发呢: (2)质量:标准库的都是经过严格测试的,正确性有保证: (3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平: (4)良好的编程风格:采用行业中普遍的做法进行开发. 一.C++标准库 C++标准库的内容分为10类, 分别是:C1.语

STL学习一:标准模板库理论基础

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),容器和算法通过迭代器可以进行无缝 地连接.几乎所有的代码都采 用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会.在C++标准中,STL被组织为下面的13个头文

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

C++ Primer Plus 第六版 第16章 string类和标准模板库

1.string实际上是模板具体化basic_string<char> 的一个typedef,有默认参数,所以省略了初始化参数 2.size_type是一个依赖于实现的整形 string将string::npos定义为字符串的最大长度 3.string类的构造函数P656 4.对于c-风格字符串,3种输入方法:cin>>   cin.getline(),cin.get 对于string   ,2种输入方法:cin>>,getline(cin,string对象) 5.st

实验8 标准模板库STL

一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http://acm.hpu.edu.cn/contest.php?cid=1020,密码c++08,共有5道题.将答题过程简单记录到实验过程中. 将答题结果写到实验结果中,并根据答题结果进行分析.反思,将其写到实验分析中,并写上实验时间.

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l