C++中常用到的容器

这里主要讲C++中经常用到的一些保存数据的容易,其中也会介绍string。

在C++11中提到了很多容器,这里主要介绍:vector、list、map。还有一些其他的容器就不做介绍了。

1.String

  这是我们用得最多的用来表示字符串的类型了 ,下面介绍一下String的一些知识:

  初始化:

  string s1;//这里默认初始化,s1是一个空字符串

string s2 = s1;//s2是s1的副本,此时s2和s1是里面保存的是一样的内容

string s3 = "hiya";//s3是该字符串字面值的副本

string s3("hiya");//等价于上面的s3

string s4(10, ‘c‘);//s4的内容是cccccccccc。(10个c)

  string对象上的操作

  os<<s;                  将s写到输出流os当中,返回os

is>>s;                   从is中读取字符串赋给s,字符串以空白分隔,返回is

getline(is, s)         从is中读取一行赋给s,返回is

s.empty();            s为空返回true,否则返回false

s.size();                返回s中字符的个数

s[n];                     返回s中第n个字符的引用,位置从0计起

s1 + s2;                返回s1和s2连接后的结果

s1 = s2;                用s2的副本代替s1中原来的字符;

s1 == s2;           如果s1和s2中所含字符完全一样,,则它们相等;string对象的相等性判断对字母的大小写敏感

s1 != s2;

<,<=,>,>=           利用字符在字典中的顺序进行比较,且对字母的大小写敏感

这里对于string类型的数据,我们可以像访问数组元素一样访问string中的对应字符。

注:还可以使用迭代器来对字符串类型做一些操作,如

string s("some things");

if (s.begin() != s.end())

{

auto it = s.begin;       //it表示s的第一个字符

*it = touper(*it);       //将当前字符改为大写形式

}

2.vector

vector类型得到标准定义为:vector<T> v1;其中T为类型,这里可以是内置类型,如int等,也可以是结构体或者类类型。

 初始化

   vector<T> v1;    //v1是一个空的vector,它潜在的元素是T类型,执行默认初始化

vector<T> v2(v1);  //v2中包含有v1的所有元素的副本

vector<T> v2 = v1; //等价于v2(v1),v2中包含有v1所有元素的副本

vector<T> v3(n, val); //v3包含了n个重复的元素,每个元素的值都是val

vector<T> v4(n); //v4中包含了n个重复执行了值初始化的对象

vector<T> v5{a,b,c,......}; //v5包含了初始值个数的元素,每个元素被赋予了相应的初始值

vector<T> v5 = {a,b,c,.......}; //等价于上面的v5

  这里要区分是列表初始化还是值初始化

  vector<int> v1(10);          //v1有10个元素,每个元素的值都是0

vector<int> v2{10};         //v2有1个元素,该元素的值为10

vector<int> v3(10,1);      //v3有10个元素,每个元素的值都是1

vector<int> v4{10,1};     //v4有2个元素,值分别为10和1

  其他操作

  v.empty()                 如果v不返回任何元素,返回真,否则返回假

v.size()                     返回v中元素的个数

v.push_back(t)         向v的尾端添加一个值为t的元素

v[n]                          返回v中第n个位置上的元素的引用,从0开始计起

v1 = v2;                    用v2中的元素的拷贝替换v1中的元素

v1 = {a,b,c,......}       用列表中的元素来拷贝替换v1中的元素

v1 == v2                   v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同

v1 != v2

<,<=,>,>=                以字典的书序进行比较

上述介绍的string和vector我们都可以使用基于范围的for语句来进行范文,如:

string str("hello");

for(auto c : str)

cout << c << endl;

这里将依次输出str中的每一个字符,且每一个字符占一行

vector<string> vec{"hello", “world"};

for(auto c : vec)

cout << c << endl;

这里会输出hello和world,且每个单词占一行

对于vector我们还可以通过基于范围的for语句来改变当中的没一个元素的值

vector<int> v{1,2,3,4,5,6,7,8,9};

for(auto &i : v) //对于v中的每一个元素(注意:i是一个引用)

i *= i;        //求每个元素的平方值

for(auto i : v)

cout << i << " ";

cout << endl;

输出结果为:1 4 9 16 25 36 49 64 81

注:不能使用下标的形式往vector对象中添加元素

3.list

  这里list和vector基本操作相同,这里就说说它们之间的区别,便于我们选择用哪一种容器更好,区别如下:

(1)  vector是顺序表,表示的是一块连续的内存,元素被顺序存储;list是双向连接表,在内存中不一定连续。

(2)当数值内存不够时,vector会重新申请一块足够大的连续内存,把原来的数据拷贝到新的内存里面;list因为不用考虑内存的连续,因此新增开销比vector小。

(3)list只能通过指针访问元素,随机访问元素的效率特别低,在需要频繁随机存取元素时,使用vector更加合适。

(4)当向vector插入或者删除一个元素时,需要复制移动待插入元素右边的所有元素;因此在有频繁插入删除操作时,使用list更加合适。

下面介绍一个list和vector中的插入。

vector中可以使用push_back()向容易的尾端插入指定的数据,但是不能使用push_front,该函数是向容器的首端插入指定的元素,这里我们就可以使用insert()函数来实现插入操作,insert包括两个参数,一个参数是迭代器,用于指出插入元素的位置,这里即使是尾端迭代器也可以,所以insert完成的是向该迭代器所指位置的前一个位置插入指定的元素,如:

vector<string> vec;

list<string> lst;

lst.insert(lst.begin(), "Hello"); //向list类型容器的lst的首端插入”Hello“

vec.insert(vec.begin(), "Hello"); //同上

insert除了上述接收两个参数的形式外,还可以接收三个参数,如:

vec.insert(vec.begin(), 10, "Hello");  //添加10个Hello字符串到vec的首端

vector<string> v = {"quasi", "simba", "frollo", "scar"};

vec.insert(vec.begin(), v.end()-2, v.end()); //将v的最后两个插入vec的首端

lst.insert(lst.end(), {"shese", "words", "will", "go”, "at", "the", "end"}); //将后面的列表中的字符串插入lst的尾部

注:迭代器表示要拷贝的范围,不能指向与目的位置相同的容器,如:

lst.insert(lst.begin(), lst.begin(), lst.end());// 这里要插入的迭代器容器是lst,但是要拷贝的范围也是lst,所以运行时会出现错误。

4.map

   map是属于关联容器这一类的,包括两个参数,第一个参数是关键字,第二个参数的该关键字对应的值。

   对map的一个经典例子是单词计数器程序:

   map<string, size_t> word_count; //string 到size_t的空map

string word;

while(cin >> word)

++word_count[word];   //提取word的计数器并将其加1

for(const auto &w : word_count)   //使用基于范围的for语句依次访问map中的数据

cout << w.first << "occurs" << w.second << ((w.second > 1) ? "times" : "time") << endl;

一般很多时候,我们会将map和set连起来一起用,如下面的例子是改进的上面的单词计数器的例子,本例子中只统计不在exclude中的单词

map<string, size_t> word_count;

set<string> exclude = {"the", "But", "And", "At", "A", "An"};

string word;

while(cin >> word)

if (exclude.find(word) == exclude.end())

++word_count[word];

时间: 2024-10-09 06:08:39

C++中常用到的容器的相关文章

Java中数组和集合容器的剖析

java中常用的存储容器就是数组的集合,每种容器存储的形式和结构又有所不同. 数组,是最基础的容器,在创建数组的时候有三种方式分别如下: int[] arr = new int[5]; int[] arr = new String[]{1,2,3,4,5}; int[] arr = {1,2,3,4,5}; 从上面的三种方式可以看出,在定义数组的时候有个共同的特点就是能够直接看出数组的长度,这也是数组的一大特点,就是定义的时候指定长度,同时数组一旦定义完成后长度就不可以变化,这也是数组在后期开发

javascript中常用坐标属性offset、scroll、client

原文:javascript中常用坐标属性offset.scroll.client 今天在学习js的时候觉得这个问题比较容易搞混,所以自己画了一个简单的图,并且用js控制台里面输出测试了下,便于理解. 1.在文档(document)对象里面用: scrollWidth/Height:获取对象的滚动宽度(滚动条可以滚动的宽度,相当于整个页面的总宽度的样子--网页正文全宽) scrollLeft/Top:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离(页面利用滚动条滚动到右边时,隐藏在

silverlight中常用的控件

一.布局控件 Canvas面板是一种很基础的布局面板,它支持对其中的控件采用绝对坐标定位.Canvas.Top和Canvas.Left.Canvas.ZIndex附加属性:如果指定了两个控件相对于父容器Canvas同样的边距,则后面声明的控件父覆盖前面声明的控件.这时我们可以使用Canvas.ZIndex属性来改变它们的显示顺序. StackPanel是一种简单的布局面板,它支持用行或列的方式来定位其中包含的控件.StackPanel 常用于安排页面上的一个很小的 UI 部分.默认情况下,Ori

Java EE中常用的四个框架

Java EE中常用的四个框架     Struts     Struts是一个基于Sun Java EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.     Struts框架可分为以下四个主要部分,其中三个就和MVC模式紧密相关:     1.模型 (Model),本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论),开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-config

Android平台中常用的可视化控件

一. TextView 二. ImageView 1.结构 java.lang.Object android.view.View android.widget.ImageView 已知直接子类: ImageButton, QuickContactBadge 已知间接子类: ZoomButton 2.类概述 显示任意图像,例如图标.ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,比便它可以在其他布局中使用,并提供例如缩放和着色(渲染)各种显示选项. 3.XML属性

Spring中常用的配置和注解详解

一.  Spring中常用的配置文件详解 Spring中的配置文件详解 1.<!-- 配置注解bean的扫描路径 该配置表示从cn包下开始扫描--> <context:component-scan base-package="cn"></context:component-scan> 2.<!-- 加载资源文件 其中Location表示从哪个路径加载配置文件properties--> <context:property-placeh

java中常用的工具类(三)

继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

STL中常用数据结构

STL中常用的数据结构: [1]  stl中stack.queue默认的底层实现为deque结构. [2]  deque:用map管理多个size大小的连续内存块,方便头尾插入. [3]  vector:变长动态数组,每次增大1.5倍,删除元素时不释放空间. [4]  priority_queue底层默认采用vector向量O(nlogn). [5]  list:双向链表容器. [6]  slist:单向链表容器. [7]  bit_vector:一个bit位元素的序列容器,常用于硬件端口的控制

iOS开发中常用的轮子 第四篇 抽屉和侧滑效果

为避免重复造轮子,很多效果和功能都可以从github上找到.清点以前的项目,整理出了很多用过的开源代码,每天奉送一批. 学习例子的方法: 1,了解:运行一遍例子,弄清这些代码的究竟是什么: 2,使用:在之后开发工程中使用这些例子: 3,研究代码:研究例子的代码的实现,简单修改做出自己的效果. 记得要么是facebook,或是twitter第一个使用了个交互效果:而后风靡全球,是产品必用抽屉:再后来就是延生出了各种变形过的效果: 所以,产品经理要你实现抽屉和侧滑效果时,一定要确定到底是什么样抽屉和