容器:
概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它
分类:
序列容器、关联容器、容器适配器
迭代器(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里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- minitab笔记
1.如何用minitab检测一组数据是否服从正态分布 打开Minitab之后点击Stat>Basic Statistics> Normality Test,分析之后若 P value(P值 ...
- 7.2 GRASP原则二:信息专家 Information Expert
2.GRASP原则二:信息专家 Information Expert What is a general principle of assigning responsibility to obje ...
- python 实现杨辉三角(依旧遗留问题)
1 #! usr/bin/env python3 #-*- coding :utf-8 -*- print('杨辉三角的generator') def triangles(): N=[1] while ...
- LeetCode 33 搜索旋转排序数组
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个 ...
- URL和URI(简单介绍)
URL与URI 我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢? URL:uniform resource location 统一资源定位符U ...
- ceph压力测试结果总结
万兆网速的ceph分布式存储单虚拟机下的带宽和iops测试结果: 带宽: 写:700-850MB 读:800-900MB iops: 写:15000-20000 读:45000-55000
- lvs负载均衡(DR模式)
lvs负载均衡(DR模式) 系统环境:lvs+keepalivedcentos7.5 ip:192.168.1.157 vip:192.168.1.150(主)centos7.5 ip:192.168 ...
- java基础(3)java常用API
1 ArrayList集合 01 创建 import java.util.ArrayList; /* 泛型:装在集合中的元素,全都是统一的一种类型.泛型必须是引用类型,不能是基本数据类型 */ pub ...
- python爬虫解析页面数据的三种方式
re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...
- QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置
1.下载: 所有Qt版本的下载地址: http://download.qt.io/archive/qt/ 实际使用了http://download.qt.io/archive/qt/5.7/5.7.1 ...