c++容器学习

转:http://blog.csdn.net/zhanghaodx082/article/details/17919401

1,using学习

两种方式:第一,完全引入命名空间y,如,using namespace std;
以后要用std中定义的符号就方便了,如cin>> ;

第二,只引入要用的符号,如,using std::cin;

注意:.h头文件中,最好不要只用第一种方式,因为.h文件在预处理时会完全复制到.cpp文件中,导致包含该.h的文件都引入了该命名空间。

2,各种容器

1)string类型

定义和初始化:string a;

string b(a);

string b("hello");

string b(5,‘m‘);

string的输入:cin>>a;
输入时会忽略开头的空白字符(包括空格,换行符,制表符),读取字符时再次遇到空白字符时,读取终止; 如,输入“   
hello”,则a为“hello”

读入未知数目的string对象,while(cin>>a);

另外,可以用getline(输入流对象,string对象)函数,如,while(cin,a)
,开头并不忽略空白字符。

string操作:s.empty() (为空,则返回1) ; s.size()
(返回string::size_type类型==unsigned); s[n] ; s1+s2 ; s1 = s2 ;s1==s2 ; s1 != s2 ;
s1>s2 ;s1>=s2 ; s1< s2 ; s1<=s2
(注意,+操作符支持string和char*连接,相当那个与把char*强制转换为string了,但多个+时,+左右两边必须至少有一个 string)。

string单个字符的操作(包括char),在cctype头文件中定义。

2)vector类型:类模板

定义和初始化:vector<T> v1;

vector<T> v2(v1);

vector<T> v2(n,i);

vector<T> v2(n);

操作:v.empty()

v.size() (返回vector<T>::size_type)

v.push_back()

v[n]

v1=v2

v1==v2 , v1!=v2,v1>v2,v1>=v2,v1<v2,v1<=v2

3)bitset类型:类模板

定义和初始化:bitset<n> b;  b有n位,每位都为0;

bitset<n> b(u); b是unsigned long型的u的一个副本; eg, bit<16> a(0xffff); //
bits0......15设为1 ;   bit<32> a(0xffff); 
//bits0.......15被设为1,16......31是0

bitset<n> b(s); b是string对象a中含有的位串的副本;  eg,string a = "1100";
bitset<32> b(a);  //b中,第2和3的位置是1,其余为0

bitset<n> b(s,pos,n); b是s中从位置pos开始的n个位的副本。 eg,string
str(111111110000000); bitset<32> b(str,5,4);  //如果省略第三个参数,则表示从指
定  的开始位置一直到结束

bitset对象上的操作:

顺序容器:根据元素位置来存储和访问元素,包括:vector,list,deque ;
顺序容器适配器stack,queue,priority_queue

1,几种顺序容器的异同点

vector:

内部数据结构:数组

访问元素:随机访问每个元素,所需要的时间为常量。

添加删除元素:在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。

迭代器:在内存重新分配后,迭代器会失效。当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失
效;否则,指向当前元素以后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素以后的任何元素的迭代器都将失效。

list:

内部数据结构:双向循环链表

访问元素:不能随机访问元素,所需时间与链表长度成线性关系

添加删除元素:任何地方添加删除元素所需时间为常量

迭代器:添加元素不会是迭代器失效 ; 删除元素,只会使被删除元素的迭代器失效,而其他迭代器不会失效。

duque:

内部数据结构:数组

访问元素:随机访问每个元素,所需要的时间为常量

添加删除元素:开头和结尾添加和删除元素与元素数目ti无关,其他位置添加和删除元素与元素数目成线性关系

迭代器:增加元素,所有迭代器都失效 ; 删除头尾元素,只有对应迭代器失效,删除其他元素,全部迭代器失效。

2,顺序容器介绍

1)定义和初始化: C<T> c;

C<T> c(c1);

C<T> c(iter1,iter2); 
//iter1是复制起始的迭代器,iter2是复制元素最后一个元素的下一个元素的迭代器;可以是同种容器的不同类型,甚至完全不同的容器类   
型,也可以用指针

C<T> c(n,t);

C<T> c(n);

容器内元素的类型约束:元素必须支持赋值元算,元素对象必须可以复制。引用不支持赋值,I/O库类型不支持复制和赋值,所以不能用作容器类型。

迭代器:iterator

iterator支持的操作:*iter,iter->mem ,
++iter,--iter,iter++,iter-- , iter1==iter2,iter1!=iter2 ;
vector和deque类型的迭代器还提供的额外操作:iter+n,iter-n , iter1+=iter2,iter1-iter2 ,
>,>=,<,<=

2)顺序容器的操作:添加/删除元素,设置容器大小,获取容器的第一个和最后一个元素

容器定义的类型别名:size_type , iterator , const_iterator ,
reverse_iterator , const_reverse_iterator , difference_type , value_type ,
reference , const_reference

获取迭代器:c.begin() , c.end() , c.rebegin() ,
c.rend()  注:如果容器是const,则返回的迭代器为const类型,即const_iterator ;
如果不是const容器,则返回普通迭代器。

容器中添加元素:c.push_back(k) ; c.insert(k) ;
c.insert(iter,n,t) ; c.insert(iter,iter1,iter2) ;     
c.push_front(k)(只是用于listhe deque)

容器中删除元素:c.erase(p),c.erase(b,e),c.clear(),c.pop_back(),c.pop_front()

容器关系操作符:前提是,1>容器类型完全相同 ;
2>容器元素类型支持关系操作,容器关系符操作本质上是容器元素关系符操作。

容器大小的操作:c.size() , c.max_size() , c.resize(n) ,
c.resize(n,t) , c.empty()

访问元素:c.back() (返回容器最后一个元素的引用), c.front()
(返回容器第一个元素的引用), c[n] (返回下标为n的元素的引用,只适合vector,deque), c.at(n)
(返回下标为n的元素的引用,只适合vector和deque)

赋值和swap:c1=c2 ;
删除c1中的元素,赋值c2中的元素到c1,c1和 c2容器类型和元素类型必须相同

c1.swap(c2)
; 不会插入和删除元素,效率较高,为时间常量;且操作后迭代器不会失效

c.assign(iter1,iter2) ; 
删除c中元素,把迭代器iter1到iter2范围内的元素赋值给c;iter不能指向c,iter指向元素可以和c中元素不同

c.assign(n,t)

vector内存分配:c.size()和c.capacity():
前一个是容器内元素个数,后一个是容器空间大小,即最多可容纳元素个数

c.resize()和c.reserve():前一个是重新分配能容纳n和元素的空间,后一个是重新分配空间,包括额外预留空间

上述vector内存分配问题,是因为vector原型是数组,元素必须在内存中连续存储,所以容器自增长时,必须删除原来元素,重新分配一个更大连续存
储空间,所以效率  
较低,所以vector实现了一种机制,自动重新分配空间时,会预留一部分多于空间。而list没有这个问题,因为list原型是链表,不需要连续存储空 间。

容器适配器,用现有容器初始化容器适配器,容器适配器提供一些特殊的操作。即容器适配器是特殊的容器。

c++容器学习,布布扣,bubuko.com

时间: 2024-08-04 18:08:17

c++容器学习的相关文章

Java 之容器学习(接上篇)

/** * * 再谈容器 * @author gao */ package com.gao.thinkinjava; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.L

java—容器学习笔记

一:迭代器 刚开始学容器,做了个简单的练习题.. 1 import java.util.ArrayList; 2 import java.util.Collection; 3 import java.util.Iterator; 4 5 public class CollectionTest { 6 public static void main(String[] args) { 7 8 Collection<String>collstr = new ArrayList<String&g

容器学习(二):动手模拟AOP

简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架.上文已经介绍模拟IoC实现,这篇文章来动手模拟AOP. AOP简述 面向对象强调"一切皆是对象",是对真实世界的模拟.然而面向对象也并非完美无缺的,它更注重于对象层次结构方面的东西,对于如何更好的管理对象行为内部结构,还存在着些许不足.那么我们如何使这个问题的得到更完美的解决呢?答案就是AOP. AOP:Aspect-Oriented Programming.AOP是OOP的补充,是GOF的延续.我们

Docker容器学习梳理--容器登陆方法梳理(attach、exec、nsenter)

对于运行在后台的Docker容器,我们运维人员时常是有登陆进去的需求.登陆Docker容器的方式: 1)使用ssh登陆容器.这种方法需要在容器中启动sshd,存在开销和攻击面增大的问题.同时也违反了Docker所倡导的一个容器一个进程的原则. 参考Docker容器学习梳理--SSH方式登陆容器 2)使用自带命令docker attach登陆容器.命令格式:docker attach container_id.不过docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所

Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)

自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker.前面已经在Docker容器学习梳理--基础知识(2)这一篇中详细介绍了Docker的网络配置以及pipework工具. docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的

stl容器学习——queue,stack,list与string

目录 string stack queue list 点击上面的内容可以实现跳转哦 简介:本文记录了对string list queue stack四个容器的学习总结,包含有四种容器常用的函数介绍和一些使用过程中碰到的细节总结,在list容器中介绍了迭代器的使用. 头文件 想要用哪一种容器,就要加上对应的头文件 比如想要使用queue , 就要加上 #include<queue> 以此类推,想要使用STL库中的容器,只要加上它们的头文件就好. string 目录部分 1.string的定义及初

docker容器学习一

Docker 学习一 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低. 适合运维工程师及后端开发人员,通过学习你可以一步一步了解 Docker 的使用. 在阅读前,你需要掌握 Linux 的常用命令.你

容器学习(一):动手模拟spring的IoC

介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一种思路. 点击下载源代码:下载 动手模拟IoC实现 首先我们把我们用的dao.service.entity定义出来: Student.java : package com.bzu.entity; public class Student { private int id; private Strin

C++容器学习,与结构体排序和set来一场邂逅

最近学习C++容器,积累一下.下面介绍set和multiset,并使用sort对结构体进行排序.C++之路漫漫其修远兮! 一.对结构体进行排序 // sort_struct.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef struct e