本文共 3660 字,大约阅读时间需要 12 分钟。
本文为《C++ Primer》的读书笔记
deque
定义在头文件deque
中… 容器均定义为模板类,需要额外提供元素类型信息:listdeque
string
delete
该指针就会导致资源泄漏!// 假定 noDefault 是一个没有默认构造函数的类型vectorv1(10, init); // 正确:提供了元素初始化器vector v2(10); // 错误: 必须提供一个元素初始化器
// iter是通过list定义的一个迭代器类型list ::iterator iter;// count是通过vector 定义的一个difference_type 类型vector ::difference_type count;
++
操作,会得到上一个元素:可以将一个普通的
iterator
转换为对应的const_iterator
, 但反之不行
auto it7 = a.begin(); // 仅当a是const时, it7是const_iteratorauto it8 = a.cbegin(); // it8是const_iterator
当不需要写访问时, 应使用
cbegin
和cend
array
除外)拷贝由一个迭代器对指定的元素范围 (不要求容器类型相同。而且, 新容器和原容器中的元素类型也可以不同, 只要能将要拷贝的元素转换为要初始化的容器的元素类型即可)listauthors = { "Milton", "Shakespeare", "Austen"};vector articles = { "a", "an", "the"};list list2(authors); //正确: 类型匹配deque authList(authors); //错误:容器类型不匹配// 正确: 可以将const char* 元素转换为stringforward_list words(articles.begin(), articles.end());
由于两个迭代器表示一个范围, 因此可以使用这种构造函数来拷贝一个容器中的子序列。例如, 假定迭代器it
表示authors
中的一个元素, 我们可以编写如下代码
// 拷贝元素, 直到(但不包括) it指向的元素dequeauthList(authors.begin(), it);
listauthors = { "Milton", "Shakespeare", "Austen"};
关联容器并不支持
vector ivec(10, -1);forward_list ivec(10); // 10个元素, 每个都初始化为0
如果元素类型是内置类型或者是具有默认构造函数的类类型,可以只为构造函数提供一个容器大小参数。如果元素类型没有默认构造函数,除了大小参数外,还必须指定一个显式的元素初始值
swap
赋值相关运算可能会导致指向左边容器内部的迭代器、引用和指针失效
arraya1 = { 0,1,2,3,4,5,6,7,8,9};array a2 = { 0}; a1 = a2; // 替换a1中的元素a2 = { 0}; // 错误: 不能将一个花括号列表赋予数组
由于右边运算对象的大小可能与左边运算对象的大小不同, 因此 array
类型不支持assign
,也不允许用花括号包围的值列表进行赋值
assign
(仅顺序容器)assign
成员允许我们从一个不同但相容的类型赋值, 或者从容器的一个子序列赋值assign
操作用参数所指定的元素(的拷贝)替换左边容器中的所有元素例如, 我们可以用assgin
实现将一个vector
中的一段char*
值赋予一个list
中的string
:
listnames;vector oldstyle;names = oldstyle; //错误:容器类型不匹配//正确: 可以将const char* 转换为stringnames.assign(oldstyle.cbegin(), oldstyle.cend());
由于其旧元素被替换,因此传递给
assign
的迭代器不能指向调用assign
的容器
// 等价于slist1.clear();// 后跟slist1.insert(slist1.begin(), 10, "Hiya!");listslistl(1); // 1个元素, 为空stringslist1.assign(10, "Hiya!"); // 10 个元素, 每个都是"Hiya!"
swap
在新标准库中, 容器既提供成员函数版本的
swap
, 也提供非成员版本的swap
。而早期标准库版本只提供成员函数版本的swap
。非成员版本的swap
在泛型编程中是非常重要的。统—使用非成员版本的swap
是一个好习惯
vectorsvec1(10); // 10 个元素的vectorvector svec2(24); // 24 个元素的vectorswap(svec1, svec2); // `svec1`将包含24个`string`元素,`svec2`将包含10个`string`
除array
外, 交换两个容器内容的操作保证会很快——元素本身并未交换, swap
只是交换了两个容器的内部数据结构
元素不会被移动的事实意味着,
除string
外, 指向容器的迭代器、引用和指针在swap
操作之后都不会失效。它们仍指向swap
操作之前所指向的那些元素。但是,在swap
之后, 这些元素已经属于不同的容器了
对一个string
调用swap
会导致迭代器、引用和指针失效
swap
两个array
会真正交换它们的元素。因此, array
在swap
操作之后,指针、引用和迭代器所绑定的元素保持不变
除了forward_list
,每个容器类型都有三个与大小相关的操作
关系运算符左右两边的运算对象必须是相同类型的容器,且必须保存相同类型的元素
比较两个容器实际上是进行元素的逐对比较。这些运算符的工作方式与string
的关系运算类似:
只有当其元素类型也定义了相应的比较运算符时,我们才可以使用关系运算符来比较两个容器(容器的关系运算符使用元素的关系运算符完成比较)
转载地址:http://iqih.baihongyu.com/