C 11学习笔记 10

发布 2022-06-17 16:07:28 阅读 9644

关键字有序保存元素,map,关联数组,保存关键字-值对,set,关键字即值,只保存关键字的容器。

multimap,关键字可重复出现。

multiset,无序集合。

unordered_map,用哈希函数组织的map

unordered_set,用哈希函数组织的set

unordered_multimap,哈希组织的map;关键字可重复出现。

unordered_multiset,哈希组织的set;关键字可重复出现。

通常map称为关联数组,与数组不同的是其下标不必是整数。

/统计每个单词在输入**现的次数。

map word_count;

string word;

while(cin>>word)

++word_count[word];

for(const auto &w:word_count)

cout<<

<< 1)?"times" :time")<定义一个map,我们必须指定关键字和值得类型。如果word还未在map中,下表运算符会创建一个新元素,其关键字为word,值为0

从map中提取一个元素时会得到一个pair类对象,first保存的是关键字。

/忽略常见单词,用set保存。

map word_count;

set exclude =

string word;

while(cin>>word)

if(只统计不在exclude中的单词。

++word_count[word];

关联容器都支持普通容器的基本操作,不支持顺序容器的位置相关的操作,如push_front或push_back。原因是关联容器中的元素是根据关键字存储的,这些操作对关联容器是没有意义的。而且,还不支持构造函数或插入操作这些接受一个元素值和一个数量值得操作。

关联容器的迭代器是双向的。

每个关联容器都定义了一个默认的构造函数,它创建一个指定类型的空容器。我们也可以将关联容器初始化为另一个同类型容器的拷贝,或是从一个范围来初始化关联容器,只要这些值可以转换为容器所需的类型就可以。

multimap或multiset允许多个元素具有相同的关键字。

对于有序的关联容器我们必须定义比较方法。默认是采用<

我们也可以提供自己的操作,但必须满足严格若需。

当两个关键字同时关联了同一个元素,我们可以使用其中任何一个访问该元素。

bool compareisbn(const sales_data &lhs, const sales_data &rhs)

return <

multiset bookstore(compareisbn);

这里我们使用decltype 来获取一个函数的指针类型时,必须加上一个*来指明我们要使用一个给定函数的指针。用compareisbn来初始化bookstore对象,表示当我们想bookstore添加元素时,通过调用compareisbn来为这些元素排序,可以用compareisbn来代替&compareisbn作为构造函数的参数,因为当我们使用一个函数名时,在需要的情况下会自动转换成指针,两者效果是一样的。

pair定义在uitlity头文件中。pair上的操作:

pair p; 初始化,分别制定成员的类型。

pair p(v1 , v2);

pair p =

make_pair(v1,v2) 返回一个用v1和v2初始化的pair。pair的类型是从v1和v2推断出来的。

共有数据成员。

两个对象之间可以使用关系运算符比较 p1 relop p2 当 < 或!( 成立时p1p1 ==p2 当first和second成员分别相等是,两个pair才相等。

p1 !=p2 用==判断。

想象有一个函数需要返回一个pair。在新标准下,可以对返回值进行列表初始化。

pair process(vector &v)

if (!return ; 列表初始化。

elsereturn pair();隐式构造返回值。

我们还可以用make_pair来返回。

return make_pair( ,

或是早期方法:

return pair( ,

关联容器额外的类型名:

key_type 关键字的类型。

mapped_type 每个关键字关联的类型,只适用于map

value_type 对于set与key_type相同,对于map为pair

set 和 map也有const和非const版本的迭代器。

通常不对关联容器使用泛型算法,关键字是const,我们可以用只读算法,如find。但不是以个好主意,不能关键字进行(快速)查找。要用自己定义的成员函数的版本。

在实际编程中,如果要对关联容器使用算法,要么是将它作为一个源序列,要么是一个目的位置。

插入元素:v是一个value_type类型的对象;args用来构造一个元素。

对于map和set, 只有当元素的关键字不在c中时才能插入。函数返回一个pair,包含一个迭代器。指向具有关键字的元素,以及一个指示插入是否成功的bool值。

对于multimap和multiset,总会插入给定的元素,并返回一个指向新元素的迭代器。

b,e是迭代器,表示一个c::value_type类型值得范围;il是这种值得初始化列表。函数返回void

对于set和map,只有插入关键字不存在的。对于multimap和multiset,则会插入范围中的每个元素。

类似insert(v) (或emplace(args))但用p指出从**开始搜索新元素应该存储的位置。返回迭代器,指向给定原件字的元素。

删除操作:从c中删除每个关键字为k的元素,返回一个size_type值。指出删除元素的数量,若果返回0表示要删除的元素么有在容器中。

从c中删除迭代器p指定的元素。p必须指向c中真是元素,不能等于返回一个指向p之后的元素的迭代器,若p指向c中的尾元素 ,则返回。

删除迭代器b和e所表示的范围中的元素,返回e

由于下标运算符可能插入一个新元素,我们只可以对非const的map使用下标操作。

使用一个不再容器中的关键在作为下标,会添加一个具有此关键字的元素到map中。

c[k] 访问关键字为k的元素,dai参数检查;若k不在c中,抛出一个out_of_range异常。

当对一个map进行下标操作时,会获得一个mapped_type的对象;担当解引用以个map迭代器时,会得到一个value_type对象。

在一个关联容器中查找元素的操作:

lower_bound和upper_bound不适合于无序容器。

下标和at操作只适用于非const的map和unordered_map

返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器。

返回关键字等于k的元素的数量。对于不允许重复关键字的容器,返回值永远是0或1

返回一个迭代器,指向第一个关键字不小于k的元素。

返回一个迭代器,指向第一个关键字大于k的元素。

返回一个迭代器pair, 表示关键字等于k的元素的范围。若k不存在,pair的两个成员等于。

如果multiset和multimap中有多个元素具有给定关键字。那么这些元素在容器中会相邻存储。

string search_item("alain de botton");

auto entries =

auto iter =

while(entries)

cout<< iter->second< +iter;

-- entries;

当我们遍历一个multimap或multiset时,保证可以得到序列中所有具有给定关键字的元素。

如果关键字在容器中,lower_bound返回的迭代器将指向第一个具有给定关键字的元素,upper_bound返回的迭代器将指向最后一个匹配给定关键字的元素之后的位置。用相同的关键字调用lower_bound和upper_bound会得到一个迭代器范围,表示所有具有该关键字的元素范围。

C11学习笔记 5

参数传递时,如果是引用类型,它将绑定到对应的实参上,否者,将实参的值拷贝后赋给形参。引用可避免拷贝,如果不需要改变参数,最好定义成常量引用。和其他初始化一样,当用实参初始化时会忽略顶层const,当形参有顶层const时,传给它常量对象或非常量对象都可以。我们可以用非常量初始化一个底层const对象...

C 11学习笔记 11

动态分配的内存,只有在显式释放是,这些对象才会销毁。但是标准库中的两智能指针可以确保自动释放。除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。静态内存用来保存局部static对象 类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数没得非stat...

C 11学习笔记 16

tuple是类型pair的模板。不同tuple类型的成员类型也不同,但一个tuple可以有任意数量的成员。每个确定的tuple类型的成员数目是固定的。当我们希望将一些数据组合成单一对象,但有不想麻烦地定义一个新数据结构来表示时,tuple是非常有用的。快速而随意 的数据结构 tuple类型及其伴随类...