容器:
概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它
分类:
序列容器、关联容器、容器适配器
迭代器(iterator):
为了方便地访问容器内的数据,迭代器应运而生。迭代器和指针具有相同的功能,对于线性容器,我们通过指针自加即可操作容器内的下一个元素,但对于链表等内存不连续的容器,指针“++”显然不能得到理想的结果,于是我们在容器内嵌套了迭代器,不同容器的迭代器重载了相同的运算符(如“++”),使得我们能够以相同的语法格式处理不同容器内的相似问题
在此之前,函数模板和类模板先了解一下.
模板是为泛型程序设计而生(设计不考虑数据类型的通用代码)
函数模板:
template <class T>
T MIN(T a ,T b)
{
return (a>=b)?b:a;
}
void main()
{
cout<<MIN(3,4)<<endl;
cout<<MIN(3.3,4.4)<<endl;
cin.get();
}
函数模板还可以重载,编译器会选择最适合的那个,类的成员函数也可以是函数模板
类模板:
template <class T>
class Array
{
public:
Array(int size=0):msize(size)
{
pstr = new T[msize];
}
~Array()
{
delete []pstr;
}
int get_size(void)
{
return msize;
}
T&operator[](size_t index)
{
if(index > msize)
{
throw out_of_range("数组下标越界");
}
else
{
return pstr[index];
}
}
void printArray(void)
{
for(int i=0;i<this->get_size();++i)
{
cout<<pstr[i]<<endl;
}
}
private:
T* pstr;
int msize;
};
void main()
{
Array<int> int_arr(4);
Array<float> float_arr(4);
for(int i=0;i<int_arr.get_size();++i)
{
int_arr[i]=i+1;
}
for(int i=0;i<int_arr.get_size();++i)
{
float_arr[i]=1.0*i+5.2;
}
int_arr.printArray();
float_arr.printArray();
try
{
cout<<int_arr[100];
}
catch(out_of_range e)
{
cout<<e.what()<<endl;
}
cin.get();
}
一、序列容器vector
vector表示一个可变长的数组
#include<vector>
template <class T>
void print_vector(vector<T> & vect)
{
cout<<vect.size()<<endl;
for(unsigned int i=0;i<vect.size();++i)
{
cout<<vect[i]<<" ";
}
cout<<"vect.capacity:"<<vect.capacity()<<endl;
}
void main()
{
vector<int> v1;
for(int i=0;i<10;++i)
{
v1.push_back(i*i);
print_vector(v1);
}
cin.get();
}
容器的大小一旦超过capacity的大小,vector会重新配置内部的存储器,这样原有数据析构,数据元素拷贝到新的内存中去,内存的重新配置会很耗时间,所有一开始构建这个vector时最好就给它分配足够的空间,避免这一过程。
二、序列容器deque
和vector一样是可变数组,不同的是deque数据存储在多块连续的内存之中,deque在预留空间存满,插入新元素扩展空间时,不会发生原有数据的拷贝和析构。在数据大小未知时选这个比vector好,用法差不多。
三、序列容器list
底层存储结构为双向链表,不支持随机访问,但在任意位置插入元素都是高速的,由于其链表结构,使其拥有一些其它STL容器没有的成员函数,且更加高效
四、关联容器set、multiset
set 即集合,声明如下:
template<class T, class Pr = less<T>, class A = allocator<A> >
class set ;
第一个为集合元素类型,第二个为其排序方式,默认为less,从小到大的顺序,第三个用于内存分配,一般不用管。
multiset 允许重复元素的存在,其余与set大致相同
5、关联容器map
话不多说,这个比较常用。这是在教程上看到的一个比较实用的统计单词个数的例子
#include<fstream>
#include<sstream>
#include<map>
#include<string>
template <class T>
void print_map(T & m)
{
T::iterator it = m.begin();
for(;it!=m.end();++it)
{
cout<<it->first<<":"<<it->second<<endl; //first key,second value
}
}
void main()
{
ifstream in("c://Users/cetc/Desktop/aa.txt"); //文件流
stringstream ss;
char c;
while((c=in.get())!=-1)
{
if(!(c>='A'&&c<='Z'||c>='a'&&c<='z'))
c=' ';
ss.put(c); //写入流中
}
string word;
map<string,int> words;
while(ss>>word) //从流向word中写入值,若key相同,则value加一1
++words[word];
print_map(words);
cin.get();
}
6、关联容器multimap
允许一对多,不再支持[]运算符
7.容器适配器 stack
template<class T , class C = deque<T> >
class stack ;
先进后出的数据结构(栈)
#include<stack>
#include<list>
void main()
{
stack<int> s1;
stack<char,list<char>> s2;
for(int i=0;i<5;++i)
{
s1.push(i+65);
s2.push(i+65);
}
while(!s1.empty()) //s2应该分开的,这里不弄了
{
cout<<s1.top()<<endl;
cout<<s2.top()<<endl;
s1.pop();
s2.pop();
}
cin.get();
}
8.容器适配器 queue 和 priority_queue
template<class T , class C = deque<T> >
class queue ;
先进先出(队列),3种序列容器中不能用vector,不能使用vector适配的原因是,vector只能从一端进行高速的插入和删除数据。priority_queue表示有顺序的queue。
不积跬步,无以至千里。
- STL容器
啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- STL容器删除元素的陷阱
今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
- GDB打印STL容器内容
GDB调试不能打印stl容器内容,下载此文件,将之保存为~/.gdbinit就可以使用打印命令了. 打印list用plist命令,打印vector用pvector,依此类推. (gdb) pvecto ...
- STL容器迭代器失效分析
连续内存序列容器(vector, string, deque) 对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效, ...
- STL容器的适用情况
转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...
- STL容器的遍历删除
STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...
- STL容器与配接器
STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector 行为类似于数组,但可以根据要求 ...
- STL容器的本质
http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- 使用metrics统计接口tps
metrics的简单介绍 metrics是一种性能指标工具,有很多开源工具使用之来来作为其性能监控,如Hadoop,Kafka,Spark,JStorm等. metrics使用最主要有三个东西: Me ...
- 《SQL 基础教程》第二章:查询基础
这一章的结构如下: SELECT 语句基础 算术运算符和比较运算符 逻辑运算符 SELECT 语句可用于查询数据,并且可以设定条件来查询具有特定值的记录.条件的设定就需要算数运算符.比较运算符和逻辑运 ...
- jq初入行常用动画
--jq动画分类--(1)jQuery的动画其实就是将之前提到过的各种特效进行封装,并对其性能进行优化.(2)jQuery动画分为三个部分:非自定义动画,自定义动画,和全局动画设置. 一.非自定义动画 ...
- Matlab:高阶常微分三种边界条件的特殊解法(中心差分法,高精度导数边界处理)
函数文件1: function b=F(f,x0,h,N) % b(1,1)=x0(1)-h*x0(2)-u(1); % b(2,1)=x0(2)+h*x0(1)^2-u(2)-h*f; b=zero ...
- hibernate环境搭建及操作
一.导入jar包.1.hibernate的jar包2.jdbc的jar包 二.配置Hibernate.建立hibernate.cfg.xml mysql配置如下: <!DOCTYPE hiber ...
- .net core Kestrel宿主服务器自定义监听端口配置
在.net core的web程序中,除了可以在项目中硬编码服务器的监听端口外,还可以在外部通过json文件配置. 方法如下: 第一步:在项目中新建一个名为Hosting.json的文件.当然,文件名可 ...
- 二十三. Python基础(23)--经典类和新式类
二十三. Python基础(23)--经典类和新式类 ●知识框架 ●接口类&抽象类的实现 # 接口类&抽象类的实现 #①抛出异常法 class Parent(object): ...
- 调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:\Program Files\php\php5isapi.dll"
把 ISAPI 筛选器这里的php配置删掉,php改用fastcgi配置
- Problem D: 类的初体验(IV)
Description 定义一个类Data,只有一个int类型的属性和如下方法: 1. 缺省构造函数,将属性初始化为0,并输出"Data's default constructor.&q ...
- nginx 开启高效文件传输模式
(1) sendfile 参数用于开启文件的高效传输模式,该参数实际上是激活了 sendfile() 功能,sendfile() 是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中的, ...