容器:
概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它
分类:
序列容器、关联容器、容器适配器
迭代器(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里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- 【异常】idea执行Main方法出现 Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
一.异常复现步骤 1)首先得是一个Spring MVC项目 注:Spring Boot项目有内置的web 容器,不会出现该问题 2)main方法存在于使用HttpServletRequest类的类中 ...
- [hdu P3085] Nightmare Ⅱ
[hdu P3085] Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 解决import caffe 时no module named protobuf的报错
ProtoBuf是Google开发的可以实现内存与非易失存储介质(硬盘文件等等)交换时的协议接口.Caffe源码中大量使用了ProtoBuf作为权值和模型参数的载体. 在Anaconda下打开Anac ...
- systemctl用法及其语法
1.确定是否安装systemd及其版本 # systemctl –version 2.确定systemd和systemctl的二进制文件和库文件的安装位置 # whereis systemd # wh ...
- NopCommerce 更改发票字体
NopCommerce 默认是用~/App_Data/Pdf/FreeSerif.ttf 这个字体的. 用这个字体,发票里的中文不能显示. 可以把c:\windows\font\simhei.ttf ...
- 读取磁盘:CHS方式
读取磁盘:CHS方式 BIOS读取磁盘 读取磁盘也是调用BIOS: 中断命令: INT 13H 读取扇区的入口参数为 AH = 02H 功能参数,读取扇区 AL = 扇区数 CH = 柱面 CL = ...
- springboot学习之构建简单项目搭建
概述 相信对于Java开发者而言,spring和springMvc两个框架一定不陌生,这两个框架需要我们手动配置的地方非常多,各种的xml文件,properties文件,构建一个项目还是挺复杂的,在这 ...
- leetcode python 012 hard 合并k个有序链表
#[LeetCode] Merge k Sorted Lists 合并k个有序链表(升序) import numpy as npimport time class Node(object): d ...
- JavaScript 中repalce的使用
把Paul Pauline pual Paula Paul中的Paul替换成Ringo <!DOCTYPE html> <html> <body> <butt ...
- jmeter接口测试基础知识1.0
jmeter:性能测试工具,压测测试计划右键--添加--Threads(Users)--线程组(线程数就是并发数)--右键线程组--添加--Sampler--HTTP请求--最上面的名称可以修改,就是 ...