C++primer(第四版)复习笔记—第二篇:容器和算法

关联容器

1、关联容器与顺序容器的本质区别在于,关联容器是按键key存储和读取元素且按key有序存放,而顺序容器则是按容器中的位置来访问元素,顺序至于加入容器的先后相关。

2、map存储key-value的pair

pair<Type1,Type2> p(v1,v2);//构造给定值的pair
make_pair(v1,v2);//以函数make_piar构造pair

6、map是key_value的集合,可理解为关联数组,以key作为下标来访问元素。如:

map<string,int>  word_cnt;//记录单词的出现次数,空
word_cnt["C++Primer"]=2;//注意:以下标访问时,如果该key不存在,则会自动加入该key的一个元素,并将其value赋值为给定值。

而vactor则不能以下标来访问不存在的元素。

7、map的迭代器指向容器中的一个键值对pair,其中pair的key为const对象,只能修改其value。

8、mulitmap与mulitset的删除函数erase只带一个参数版本的,将会删除容器中该key的所有元素,并返回删除的个数,而带迭代器的则只会删除其指定的那一个元素。

9、mulitmap与mulitset中同一key的元素,存储在相邻位置,遍历时可保证依次返回相同key的元素。因此count(key)返回该key的元素个数,而find(key)则返回该key的第一个函数。

以下给出一个应用map容器的简单实例:读取一个文件,记录文件中每个单词出现的次数,并按字典顺序输出出现的单词和对应的次数

#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <sstream>
using namespace std;

int main()
{
    ifstream ifile;
    string filename;
    cout<<"input filename: "<<endl;
    //filename="ifile.txt";
    cin>>filename;
    ifile.open(filename.c_str());
    if(!ifile)
    {
        cout<<"open file failed!";
        return -1;
    }
    map<string,int> word_cnt;
    string str;
    string word;

    while(getline(ifile,str))//按行读文件,并保存
    {
        istringstream iss(str);
        while(iss>>word) //将该按单词分解,并记录其出现的次数
          ++word_cnt[word];
    }

    map<string,int>::const_iterator mit=word_cnt.begin();
    /*按字典顺序输出每个单词出现的次数(即map字典按key排序)*/
    for(;mit!=word_cnt.end();++mit)
    {
        string temp(" time");
        if(mit->second>1)
            temp+="s";
        cout<<mit->first<<" occurs : " <<mit->second<<temp<<endl;
    }

   return 0;

}
时间: 2024-10-05 14:20:24

C++primer(第四版)复习笔记—第二篇:容器和算法的相关文章

C++ Primer 第四版读书笔记(四)之表达式

表达式由一个或多个操作数通过操作符组合而成.最简单的表达式仅包含一个字面值常量或变量.较复杂的表达式则由操作符以及一个或多个操作数构成. 每个表达式都会产生一个结果.如果表达式中没有操作符,则其结果就是操作数本身的值.当一个对象用在需要使用其值的地方,则计算该对象的值. 操作符的含义--该操作符执行什么操作以及操作结果的类型--取决于操作数的类型. C++提供了一元操作符和二元操作符两种操作符.作用在一个操作数上的操作符称为一元操作符.如曲地址符(&)和解引用操作符(*):而二元操作符则作用于两

C++ Primer 第四版读书笔记(八)之顺序容器

容器容纳特定类型对象的集合. 标准库vector类型,是一个顺序容器.它将单一类型元素聚集起来称为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定. 标准库定义了三种顺序容器类型:vector.list和deque.它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价.标准库还提供了三种容器适配器.实际上,适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型. 顺序容器类型 顺

C++ Primer 第四版读书笔记(六)之函数

内联函数.类成员函数和重载函数以及函数指针. 函数可以看作程序员定义的操作.与内置操作符相同的是,每个函数都会实现一系列的计算,然后(大多数时候)生成一个结算结果.但与操作符不同的是,函数有自己的函数名,而且操作数没有数量限制.与操作符一样,函数可以重载,这意味着同样的函数名可以对应对个不同的函数. 一.函数的定义 函数由函数名以及一组操作数类型唯一地表示.函数的操作数,也即形参(parameter),在一对圆括号中声明,形参与形参之间以逗号分隔.函数执行的计算在一个称为函数体(function

C++ Primer 第四版读书笔记(二)之标准库类型

C++定义了一个内容丰富的抽象数据类型标准库,其中最重要的标准库类型是string和vector,它们分别定义了大小可变的字符串和集合.string和vector往往将迭代器用作配套类型,用于访问string中的字符,或者vector中的元素. 另一种标准库类型为bitset,提供了一种抽象方法来操作位的集合. string类型支持长度可变的字符串,vector用于保存一组指定类型的对象. bitset类标准库类型提供了更方便和合理有效的语言级的抽象设施.通过这个类可以把某个值当作位的集合来处理

C++ Primer 第四版读书笔记(七)之标准IO库

C++的输入/输出由标准库提供.标准库定义了一组类型,支持对文件和控制窗口等设备的读写(IO).还定义了其他一些类型,使string对象能够像文件一样操作,从而使我们无需IO就能实现数据与字符之间的转换.一般来说,类的设计者还可以很方便地使用IO标准库设施读写自定义类的对象.类类型通常使用IO标准库为内置类型定义的操作符和规则来进行读写. 一.面向对象的标准库 迄今为止,我们已经使用IO类型和对象读写数据流,它们常用于与用户控制窗口的交互.当然,实际的程序不能仅限于对控制窗口的IO,通常还需要读

C++ Primer 第四版读书笔记(五)之语句

通常情况下,语句是顺序执行的.但是,除了最简单的程序外,只有顺序执行往往并不足够.为此,C++定义了一组控制流语句,允许有条件地执行或者重复地执行某部分功能. 1.1 简单语句 C++中,大多数语句以分号结束. 表达式语句用于计算表达式. 1.2 声明语句 在C++中,对象或类的定义或声明也是语句. 1.3 复合语句 复合语句,通常被称为块,使用一对花括号括起来的语句序列.块标识了一个作用域,在块中引入的名字只能在该块内部或者嵌套在块中的子块里访问.通常,一个名字只从其定义处到该块结尾这段范围内

C++ Primer 第四版读书笔记(三)之数组与指针

C++语言提供了两种类似于vector和迭代器类型的低级复合类型--数组与指针.与vector类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素. 现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针.设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针. 数组是C++语言中类似于标准库vector类型的内置数据结构.与vector类似,数组也是一种

C++ Primer 第四版读书笔记(八)之顺序容器(续)

3.6 访问元素 如果容器非空,那么容器类型的front和back成员将返回容器内第一个或最后一个元素的引用. 访问顺序容器内元素的操作 c.back() 返回容器c的最后一个元素的引用.如果c为空,则该操作未定义 c.front() 返回容器c的第一个元素的引用.如果c为空,则该操作未定义 c[n] 返回下标为n的元素的引用 如果n<0或n>c.size(),则该操作未定义 只适用于vector和deque容器 c.at[n] 返回下标为n的元素的引用.如果下标越界,则该操作未定义 只适用于

C++ Primer 第四版读书笔记(一)之变量和基本类型

C++语言定义了几种基本类型:字符型.整形.浮点型等. 1.基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型,另外还定义了一种称为void的特殊类型. 表1.1 C++:算术类型 类型 含义 最小存储空间 bool 布尔型 - char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 int 整形 16位 long 长整形 32位 float 单精度浮点型 6位有效数字 double 双精度浮点型 10位有效数字 long double 扩展