容器:
概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它
分类:
序列容器、关联容器、容器适配器
迭代器(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里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- word->excel数据处理
朋友发来一个word文件,里面的数据没有分割,想分割后放到excel统计 通常遇到这种数据,首先想到每一列数据有没有什么特征 类似这种数据,一种办法是按位数截取,mid函数,或者按第一次出现数字的方式 ...
- codeforces 343d
题意:一棵树结构上有水,往一个节点加水,那么所有的子节点都会有水,或者排干一个节点的水,那么它的上面的节点都会没水. 用dfs序,数组记录区间内全部有水为1,区间内有没水的点就为0. 倒水:区间更新, ...
- android ncnn
1.下载解压ndk wget https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip unzip andr ...
- 机器学习 之KNN近邻法
目录 1.KNN近邻法 1.KNN近邻法 KNN模型由三个基本要素决定: 距离度量:其中欧式距离一般误差最小,\(x_{i} 和 x_{j}\)为两个样本点:\[L_{2}(x_{i}, x_{j}) ...
- django-celery的配置及使用
Celery简介 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理 celery的应用 异步调用:那些用户不关心的但是又存在在我们API里面的操作 ...
- vim 插件 -- NERDTree
介绍 NERDTree 插件就是使vim编辑器有目录效果. 所谓无图无真相,所以直接看这个插件的效果图吧. 下载 https://www.vim.org/scripts/script.php?scri ...
- xss之cookie窃取
一.窃取cookie有什么用? cookie相当于一个身份证 有了管理员的cookie我们不需要帐号密码就可以登陆 二.反射型xss有存贮型xss什么区别? 反射 xss 和服务器没有交互 只能用一 ...
- .net core 使用 ef core
第一步: 创建一个.net core console app. 第二步:安装EFCore package 和 design(以前vs是有EF项目模板的,core版本现在没有,所有安装这个工具来创建M ...
- ln 链接命令 简要说明 软硬链接关系说明
ln [选项] 目标 -s 创建符号链接(软链接) -f 强制创建链接 -i 覆盖前先询问 -v 显示创建链接过程 ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接经常被用到 删除软链接 ...
- My SQL随记 001 常用名词/结构化语言
DBMS (Database Management System) 字段/域(列名或者列头 如:姓名身高性别为字段) 姓名 身高 性别 小周周 157 女 记录(一行数据 如:小周周 157 女 ) ...