容器:
概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它
分类:
序列容器、关联容器、容器适配器
迭代器(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里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- Django框架简介-模板系统
2.4 模板 官方文档 2.4.1 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 2.4.1.1 变量 {{ 变量名 }} 变量名由字母数 ...
- 6、什么是TypeScript、TypeScript的安装、转换为.js文件
1.什么是TypeScript (本人用自己的理解梳理了一下,不代表官方意见) TypeScript:Type+ECMAScript6 TypeScript是一种预处理编程语言,遵循es6标准规范,在 ...
- Vue(五) 购物车案例
这一篇把之前所学的内容做一个总结,实现一个购物车样例,可以增加或者减少购买数量,可移除商品,并且购物车总价随着你的操作实时变化. 实现效果如图: 代码: <!DOCTYPE html> & ...
- Hibernate----面试题
什么是Hibernate? hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率. 什么是ORM? orm不过是一种思想,对象关系映射.是对象关系模型,如h ...
- redis持久化RDB与AOF
redis持久化 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. RDB持久化 ...
- tensorboard使用方法
http://blog.csdn.net/u010099080/article/details/77426577
- STL源码剖析01-allocator
#include <iostream> #include <new> #include <cstddef> #include <vector> usin ...
- 表单验证,添加动态class
- go web framework gin 启动流程分析
最主要的package : gin 最主要的struct: Engine Engine 是整个framework的实例,它包含了muxer, middleware, configuration set ...
- 容器的注入和container设计的思想——Injection Container 理解
为什么会出现容器的注入? 容器:顾名思义,装东西的器物. 至于spring中bean,aop,ioc等一些都只是实现的方式:具体容器哪些值得我们借鉴,我个人觉得是封装的思想.将你一个独立的系统功能放到 ...