临时记录_C++容器相关

-? <span class="timestamp-wrapper"><span class="timestamp">[2020-01-10 五 11:53] </span></span> 第9章 顺序容器

? ?

? ? ? ? vector,随机访问、大小可变、尾部之外插入删除慢、额外空间开销小

? ? ? ? deque, 随机访问、大小可变、头尾之外插入删除慢、额外空间开销小

? ? ? ? list, 顺序双向访问、大小可变、插入很快、额外空间开销大

? ? ? ? forward_list,顺序单向访问、大小可变、插入很快、额外空间开销大

? ? ? ? array, 随机访问、固定大小、不能增删、额外空间开销小

? ? ? ? string, 类似vector、专为字符、额外空间开销小

-? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-12 日 10:56> </span></span> 9.2 容器库概览

? ?

? ? ? ? 描述容器接口的思路:

? ? ? ? 1、所有容器通用接口

? ? ? ? 2、顺序与非顺序容器的特定接口

? ? ? ? 3、其它特殊容器特殊接口(如string)

? ? ? ?

? ? ? ? 类型别名

? ? ? ? iterator

? ? ? ? const_iterator

? ? ? ? size_type

? ? ? ?

? ? ? ? difference_type

? ? ? ? value_type

? ? ? ? reference

? ? ? ? const_reference

? ? ? ?

? ? ? ? 构造函数

? ? ? ? C c;

? ? ? ? C c1(c2);

? ? ? ? C c(b,e);

? ? ? ? C c{a,b,c...};

? ? ? ?

? ? ? ? 赋值与swap

? ? ? ? c1=c2;

? ? ? ? c1={a,b,c...};

? ? ? ? a.swap(b);

? ? ? ? swap(a,b);

? ? ? ?

? ? ? ? 大小

? ? ? ? c.size();

? ? ? ? c.max_size();

? ? ? ? c.empty();

? ? ? ?

? ? ? ? 增删(不适用于array)

? ? ? ? c.insert(args);

? ? ? ? c.emplace(inits);

? ? ? ? c.erase(args)

? ? ? ? c.clear();

? ? ? ?

? ? ? ? 关系

? ? ? ? ==,!=,<,<=,>,>=

? ? ? ?

? ? ? ? 迭代器

? ? ? ? c.begin(),c.end();

? ? ? ? c.cbegin(),c.cend();

? ? ? ?

? ? ? ? 反向额外成员

? ? ? ? reverse_iterator

? ? ? ? const_reverse_iterator

? ? ? ? c.rbegin(),c.rend():

? ? ? ? c.crbegin(),c.crend();

? ?

? ? ? ? vector<NoDefault> v1(10,init)//对于一个没有默认构造函数的类型NoDefault通过元素初始化器。

? ? ? ?

? ? ? ? 容器是模板类,容器元素可以任何甚至可以是另外一个容器类,但是旧版编译器需要在两个尖括号之间加入空格,例如:

? ? ? ? vector<vector<string> >;

? ?

? ? ? ? 两个迭代器构成的迭代器范围是左闭右开的,即:[begin,end), end可以与begin是同一个位置(范围为空),但是不能在begin之前。

? ? ? ? 两个迭代器可以指向同一个容器中的元素或者最后一个元素之后的位置。

? ?

? ? ? ? 迭代器函数

? ? ? ? begin/end这类返回迭代器的函数是被重载的,如果对象是普通变量,返回的是正常的iterator,如果是常量返回的则是const_iterator。

? ? ? ? 以c开头的函数是C++新引入的,以支持auto,与begin/end一起使用。

? ? ? ?

? ? ? ? 带r版本的迭代器是反向的。

-? <span class="timestamp-wrapper"><span class="timestamp">[2019-11-30 六 13:35] </span></span> 将一个容器初始化为另一个容器的拷贝

? ?

? ? 容器定义和初始化

? ?

? ? ? ? //默认构造函数

? ? ? ? C c;

? ? ? ?

? ? ? ? //用一个容器创建另一个做为它的拷贝的容器,必须两个容器的类型、以及容器元素类型都一样,array的大小还必须一样。

? ? ? ? C c1(c2);

? ? ? ? C c1=c2;

? ? ? ?

? ? ? ? //c初始化为初始化列表元素的拷贝,列表元素与容器元素类型必须相同;array时,列表必须不能超过array大小

? ? ? ? C c{a,b,c...};

? ? ? ? C c={a,b,c...};

? ? ? ?

? ? ? ? //初始化为范围中的元素,范围中元素类型必须与C中元素类型相同(不能是array)

? ? ? ? C c(b,e);

? ? ? ?

? ? ? ? //只适合顺序容器

? ? ? ? C seq(n);//n个元素进行值初始化,构造函数是explicit的(即阻止自动隐式转换)(不能是string)

? ? ? ? C seq(n,t);//n个元素,初始化为值t

? ?

? ? ? ? 用一个容器创建另一个做为它的拷贝的容器,必须两个容器的类型、以及容器元素类型都一样,array的大小还必须一样。

? ? ? ? list<string> list2(authors);

? ? ? ?

? ? ? ? 用迭代器范围来初始化容器类型和容器元素的类型都可以不同,因为直接替换了容器原来的元素。

? ? ? ? deque<string> authList(authors.begin(),it);//包括[begin(),it)迭代器范围

? ? ? ?

? ? ? ? 用列表初始化,列表隐含了被初始化容器的大小。

? ? ? ? list<string> authors = {"one", "two", "three"};

? ? ? ? 除array外,初始化列表赋值之后,元素大小变为初始化列表大?。ㄊ樵蛞蟪跏蓟斜泶笮⌒∮谑椋?/p>

? ? ? ?

? ? ? ? 顺序容器相关,如果没有默认构造函数,必须用两个参数的,第二个参数提供默认值;如果有默认构造函数,则只需要传递元素数目也行。

? ? ? ? vector<int> ivec(10,-1);//10个元素,每个值-1

? ? ? ? forward<int> ivec(10);//10个元素,每个值0

? ? ? ?

? ? ? ? 注:上面的例子中,authors是list。

-? 9.2.5 赋值和swap

? ?

? ? ? ? c1=c2;

? ? ? ? c={a,b,c...};

? ? ? ? swap(c1,c2);

? ? ? ? c1.swap(c2);

? ? ? ?

? ? ? ? seq.assign(b,e);

? ? ? ? seq.assign(il);

? ? ? ? seq.assign(n,t);

? ?

? ? ? ? 大小是array类型的一个部分:

? ? ? ? array<int,10> size_type i;

? ? ? ? 所以array构造函数是不应当有大小参数的。

? ? ? ?

? ? ? ? 与内置数组不同,array可以赋值和初始化,不过使用其它数组赋值的时候,要求数组类型匹配(大小、元素类型)

? ? ? ? array<int,10> ia2={0,1,2,3,4,5,6,7,8,9};

? ? ? ? array<int,10> ia3={42};

? ? ? ?

? ? ? ? array<int,10> ia4=ia3;

? ? ? ? 如果列表初始化,则列表大小需要小于数组,并且剩余的元素要有相应的默认构造函数来进行默认初始化。

? ? ? ? 注:花括号初始化列表只能初始化赋值,不能初始化之后,再用花括号对数组进行赋值。非数组可以用花括号赋值。

? ?

? ? ? ? assign只用于除了array之外的顺序容器。允许从不同但相容类型赋值

? ? ? ? 由于是旧元素被替换,传递给assign的迭代器不能指向调用assign的容器。

? ?

? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-13 一 13:21> </span></span> 使用swap

? ?

? ? ? ? 除array之外,swap不会导致元素拷贝、删除、插入。swap后,string的迭代器会失效,数组的迭代器会指向原来的位置(但是元素已经被置换了),而其它的迭代器也会被置换(各自仍指向原来被换的元素)。

? ?

? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 10:59> </span></span> 比较

? ?

? ? ? ? 容器比较必须保证元素类型和容器类型是相同的,并且只有元素也定义了比较运算才能使用运算符号对容器进行比较。

? ?

? ? -? 9.3 容器操作

? ? ? ? 插入相关

? ? ? ?

? ? ? ? ? ? //尾部追加,forwardlist不支持

? ? ? ? ? ? c.push_back(t);//值为t的元素

? ? ? ? ? ? c.emplace_back(args);//args创建的元素

? ? ? ? ? ?

? ? ? ? ? ? //头部创建,vector与string不支持

? ? ? ? ? ? c.push_front(t);

? ? ? ? ? ? c.emplace_front(args);

? ? ? ? ? ?

? ? ? ? ? ? //指定位置之前的插入,forwardlist不支持下面的而是有自己专用的insert和emplace

? ? ? ? ? ? c.insert(p,t);//在p迭代器对应元素之前插入值为t的元素

? ? ? ? ? ? c.emplace(p,args);

? ? ? ? ? ? c.insert(p,n,t);//n个值为t的元素

? ? ? ? ? ? c.insert(p,b,e);//迭代器范围[b,e)

? ? ? ? ? ? c.insert(p,il);//花括号元素列表il

? ? ? ?

? ? ? ? ? ? 对象插入或初始化容器后,容器中的对应元素与对象并无关系,对象只是拷贝,类似传值调用。

? ? ? ?

? ? ? ? ? ? emplace直接在容器管理的空间中创建对象而不拷贝对象,emplace参数必须与元素类型构造函数参数匹配,

? ? ? ?

? ? ? ? 访问相关

? ? ? ?

? ? ? ? ? ? 访问成员函数返回的是引用

? ? ? ? ? ? front()是首元素(begin()),back是尾元素(end()-1),forwardlist不支持back();

? ? ? ? ? ? c.front(),c.back();

? ? ? ? ? ?

? ? ? ? ? ? 下标操作和at()可以随机访问,下标需要程序员自己注意越界情况,而at()会在越界的时候自动抛出相关的out_of_range错误

? ? ? ? ? ? c[n],c.at(n);

? ? ? ?

? ? ? ? 删除相关

? ? ? ?

? ? ? ? ? ? //forwardlist不支持erase,它有自己专用的删除函数

? ? ? ? ? ? //下面操作改变容器大小所以不支持array

? ? ? ? ? ? c.pop_back();//删除尾元素,forwardlist不支持

? ? ? ? ? ? c.pop_front();//删除首元素,vector和string不支持

? ? ? ? ? ?

? ? ? ? ? ? c.erase(p);//删除p所指向的元素(p是迭代器)

? ? ? ? ? ? c.erase(b,e);//删除[b,e)范围内的元素

? ? ? ? ? ? c.clear();//删除所有元素

? ? ? ?

? ? ? ? forwardlist特殊的函数

? ? ? ?

? ? ? ? ? ? //特殊的迭代器

? ? ? ? ? ? lst.before_begin();//首元素之前不存在的元素迭代器

? ? ? ? ? ? lst.cbefore_begin();

? ? ? ? ? ?

? ? ? ? ? ? //特殊的插入

? ? ? ? ? ? lst.insert_after(p,t);

? ? ? ? ? ? lst.insert_after(p,n,t);

? ? ? ? ? ? lst.insert_after(p,b,e);

? ? ? ? ? ? lst.insert_after(p,il);

? ? ? ? ? ?

? ? ? ? ? ? emplace_after(p,args);

? ? ? ? ? ?

? ? ? ? ? ? //特殊的删除

? ? ? ? ? ? lst.erase_after(p);

? ? ? ? ? ? lst.erase_after(b,e);

? ?

? ? -? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 11:50> </span></span> 9.3.5改变容器大小

? ? ? ?

? ? ? ? ? ? c.resize(n);

? ? ? ? ? ? c.resize(n,t);

? ?

? ? -? 9.3.6 容器操作可能会使迭代器失效

? ? ? ?

? ? ? ? ? ? 插入、删除都可能导致容器迭代器失效,不同容器情况不同(比如vector、list等)具体参考相关位置。

? ? ? ? ? ?

? ? ? ? ? ? 大致情况如下:

? ? ? ? ? ? 对于插入,

? ? ? ? ? ? 指向list/forwardlist的引用、指针、迭代器都不会失效;

? ? ? ? ? ? vector/string若重新分配则指针、引用、迭代器全失效,若未重新分配则插入之前的引用、指针、迭代器不会失效;

? ? ? ? ? ? deque插入首尾之外则指针、引用、迭代器全失效,插入首尾则迭代器失效但是指向存在的指针、引用不会失效。

? ? ? ? ? ?

? ? ? ? ? ? 对于删除,

? ? ? ? ? ? 指向被删元素的迭代器、指针、引用全都失效;

? ? ? ? ? ? 指向list/forwardlist其它位置的引用、指针、迭代器都不会失效;

? ? ? ? ? ? deque删除首尾之外则其它元素指针、引用、迭代器全失效,删除尾部则尾后迭代器失效其它不失效,删除首部则其它都不会被影响。

? ? ? ? ? ? 指向vector/string被删除元素之前的指针、引用、迭代器都有效。

? ? ? ? ? ? 只要删除元素,尾后迭代器都失效。

? ? ? ?

? ? ? ? ? ? 对于vector/string/deque,为防止失效,循环中操作容器后需要更新迭代器、引用、指针。

? ? ? ? ? ? insert()/erase()均会返回新迭代器,用它更新迭代器即可。

? ? ? ? ? ? 类似如下这样进行:

? ? ? ? ? ? inter= vi.insert(...);

? ? ? ? ? ? inter= vi.erase(....);

? ? ? ? ? ?

? ? ? ? ? ? 不要在循环外保存c.end()返回的尾迭代器做为判断,而直接每次使用新的返回值

? ? ? ? ? ? 类似如下这样进行:

? ? ? ? ? ? while(begin != v.end())

? ? ? ? ? ? {...}

? ?

? ? -? 9.4 vector对象是如何增长的

? ? ? ?

? ? ? ? ? ? vector元素连续,增加元素会导致重新分配空间,移动所有元素,所以通过一定策略预先给它分配多余的预留空间,防止频繁移动所有元素。

? ? ? ? ? ? capacity()告诉我们不重新分配内存(扩张)的情况下可以容纳多少个元素;reserve告诉我们它应当预留准备保存的元素数目。

? ? ? ? ? ? c.shrink_to_fit();//将capacity减少到与size(即实际的元素数)同样大小。

? ? ? ? ? ? c.capacity();//最大能保存的元素数目,超过则重新分配内存。

? ? ? ? ? ? c.reserve(n);//预留n的空间,不改变容器元素数量,仅影响vector预先分配多大的空间。

? ? ? ? ? ?

? ? ? ? ? ? 当需求大于当前容量,reserve才会改变vector容量,至少会分配与需求一样大的空间;当需求小于等于当前容量,reservse什么都不做并且小于时也并不会退回多余的空间。当调用reserve之后,capacity空间大小会大于等于传给reserve的参数。

? ? ? ? ? ?

? ? ? ? ? ? 总之,reserve不会减少容器占用的空间。类似地,resize只减少容器元素数目而不是容器容量,也不能用它减少预留空间。

? ? ? ? ? ?

? ? ? ? ? ? shrink_to_fit()会要求退回多余空间,但是实际也不保证一定退回。

? ? ? ?

? ? ? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-19 日 12:15> </span></span> capacity和size

? ?

? ? -? <span class="timestamp-wrapper"><span class="timestamp">[2020-03-17 二 11:48] </span></span> 9.5额外的string操作

? ? ? ?

? ? ? ? ? ? 创建函数:使用const char*创建string对象时,如果未指定创建的大小或者指定的大小大于const char*字符数目,那么const char*必须以NULL空字符结束,否则不用。

? ? ? ? ? ? string(s), string(s,pos), string(s,pos,n)

? ? ? ? ? ? substr(pos), substr(pos,n)

? ? ? ? ? ?

? ? ? ? ? ? 修改字符串的操作:insert(),erase(),assign(),append(),replace()

? ? ? ? ? ?

? ? ? ? ? ? 搜索函数:返回string:size_typ类型,是下标,没有匹配则返回最大值npos的static成员。

? ? ? ? ? ? find(),rfind(),find_first_of(),find_last_of(),find_first_not_of(),find_last_not_of()

? ? ? ? ? ?

? ? ? ? ? ? 比较函数: compare()

? ? ? ? ? ?

? ? ? ? ? ? 数值转换:to_string(val),stoi(),stol(),stoul(),stoll(),stoull(),stof(),stod(),stold()-? <span class="timestamp-wrapper"><span class="timestamp">[2020-01-10 五 11:53] </span></span> 第9章 顺序容器

? ?

? ? ? ? vector,随机访问、大小可变、尾部之外插入删除慢、额外空间开销小

? ? ? ? deque, 随机访问、大小可变、头尾之外插入删除慢、额外空间开销小

? ? ? ? list, 顺序双向访问、大小可变、插入很快、额外空间开销大

? ? ? ? forward_list,顺序单向访问、大小可变、插入很快、额外空间开销大

? ? ? ? array, 随机访问、固定大小、不能增删、额外空间开销小

? ? ? ? string, 类似vector、专为字符、额外空间开销小

-? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-12 日 10:56> </span></span> 9.2 容器库概览

? ?

? ? ? ? 描述容器接口的思路:

? ? ? ? 1、所有容器通用接口

? ? ? ? 2、顺序与非顺序容器的特定接口

? ? ? ? 3、其它特殊容器特殊接口(如string)

? ? ? ?

? ? ? ? 类型别名

? ? ? ? iterator

? ? ? ? const_iterator

? ? ? ? size_type

? ? ? ?

? ? ? ? difference_type

? ? ? ? value_type

? ? ? ? reference

? ? ? ? const_reference

? ? ? ?

? ? ? ? 构造函数

? ? ? ? C c;

? ? ? ? C c1(c2);

? ? ? ? C c(b,e);

? ? ? ? C c{a,b,c...};

? ? ? ?

? ? ? ? 赋值与swap

? ? ? ? c1=c2;

? ? ? ? c1={a,b,c...};

? ? ? ? a.swap(b);

? ? ? ? swap(a,b);

? ? ? ?

? ? ? ? 大小

? ? ? ? c.size();

? ? ? ? c.max_size();

? ? ? ? c.empty();

? ? ? ?

? ? ? ? 增删(不适用于array)

? ? ? ? c.insert(args);

? ? ? ? c.emplace(inits);

? ? ? ? c.erase(args)

? ? ? ? c.clear();

? ? ? ?

? ? ? ? 关系

? ? ? ? ==,!=,<,<=,>,>=

? ? ? ?

? ? ? ? 迭代器

? ? ? ? c.begin(),c.end();

? ? ? ? c.cbegin(),c.cend();

? ? ? ?

? ? ? ? 反向额外成员

? ? ? ? reverse_iterator

? ? ? ? const_reverse_iterator

? ? ? ? c.rbegin(),c.rend():

? ? ? ? c.crbegin(),c.crend();

? ?

? ? ? ? vector<NoDefault> v1(10,init)//对于一个没有默认构造函数的类型NoDefault通过元素初始化器。

? ? ? ?

? ? ? ? 容器是模板类,容器元素可以任何甚至可以是另外一个容器类,但是旧版编译器需要在两个尖括号之间加入空格,例如:

? ? ? ? vector<vector<string> >;

? ?

? ? ? ? 两个迭代器构成的迭代器范围是左闭右开的,即:[begin,end), end可以与begin是同一个位置(范围为空),但是不能在begin之前。

? ? ? ? 两个迭代器可以指向同一个容器中的元素或者最后一个元素之后的位置。

? ?

? ? ? ? 迭代器函数

? ? ? ? begin/end这类返回迭代器的函数是被重载的,如果对象是普通变量,返回的是正常的iterator,如果是常量返回的则是const_iterator。

? ? ? ? 以c开头的函数是C++新引入的,以支持auto,与begin/end一起使用。

? ? ? ?

? ? ? ? 带r版本的迭代器是反向的。

-? <span class="timestamp-wrapper"><span class="timestamp">[2019-11-30 六 13:35] </span></span> 将一个容器初始化为另一个容器的拷贝

? ?

? ? 容器定义和初始化

? ?

? ? ? ? //默认构造函数

? ? ? ? C c;

? ? ? ?

? ? ? ? //用一个容器创建另一个做为它的拷贝的容器,必须两个容器的类型、以及容器元素类型都一样,array的大小还必须一样。

? ? ? ? C c1(c2);

? ? ? ? C c1=c2;

? ? ? ?

? ? ? ? //c初始化为初始化列表元素的拷贝,列表元素与容器元素类型必须相同;array时,列表必须不能超过array大小

? ? ? ? C c{a,b,c...};

? ? ? ? C c={a,b,c...};

? ? ? ?

? ? ? ? //初始化为范围中的元素,范围中元素类型必须与C中元素类型相同(不能是array)

? ? ? ? C c(b,e);

? ? ? ?

? ? ? ? //只适合顺序容器

? ? ? ? C seq(n);//n个元素进行值初始化,构造函数是explicit的(即阻止自动隐式转换)(不能是string)

? ? ? ? C seq(n,t);//n个元素,初始化为值t

? ?

? ? ? ? 用一个容器创建另一个做为它的拷贝的容器,必须两个容器的类型、以及容器元素类型都一样,array的大小还必须一样。

? ? ? ? list<string> list2(authors);

? ? ? ?

? ? ? ? 用迭代器范围来初始化容器类型和容器元素的类型都可以不同,因为直接替换了容器原来的元素。

? ? ? ? deque<string> authList(authors.begin(),it);//包括[begin(),it)迭代器范围

? ? ? ?

? ? ? ? 用列表初始化,列表隐含了被初始化容器的大小。

? ? ? ? list<string> authors = {"one", "two", "three"};

? ? ? ? 除array外,初始化列表赋值之后,元素大小变为初始化列表大?。ㄊ樵蛞蟪跏蓟斜泶笮⌒∮谑椋?。

? ? ? ?

? ? ? ? 顺序容器相关,如果没有默认构造函数,必须用两个参数的,第二个参数提供默认值;如果有默认构造函数,则只需要传递元素数目也行。

? ? ? ? vector<int> ivec(10,-1);//10个元素,每个值-1

? ? ? ? forward<int> ivec(10);//10个元素,每个值0

? ? ? ?

? ? ? ? 注:上面的例子中,authors是list。

-? 9.2.5 赋值和swap

? ?

? ? ? ? c1=c2;

? ? ? ? c={a,b,c...};

? ? ? ? swap(c1,c2);

? ? ? ? c1.swap(c2);

? ? ? ?

? ? ? ? seq.assign(b,e);

? ? ? ? seq.assign(il);

? ? ? ? seq.assign(n,t);

? ?

? ? ? ? 大小是array类型的一个部分:

? ? ? ? array<int,10> size_type i;

? ? ? ? 所以array构造函数是不应当有大小参数的。

? ? ? ?

? ? ? ? 与内置数组不同,array可以赋值和初始化,不过使用其它数组赋值的时候,要求数组类型匹配(大小、元素类型)

? ? ? ? array<int,10> ia2={0,1,2,3,4,5,6,7,8,9};

? ? ? ? array<int,10> ia3={42};

? ? ? ?

? ? ? ? array<int,10> ia4=ia3;

? ? ? ? 如果列表初始化,则列表大小需要小于数组,并且剩余的元素要有相应的默认构造函数来进行默认初始化。

? ? ? ? 注:花括号初始化列表只能初始化赋值,不能初始化之后,再用花括号对数组进行赋值。非数组可以用花括号赋值。

? ?

? ? ? ? assign只用于除了array之外的顺序容器。允许从不同但相容类型赋值

? ? ? ? 由于是旧元素被替换,传递给assign的迭代器不能指向调用assign的容器。

? ?

? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-13 一 13:21> </span></span> 使用swap

? ?

? ? ? ? 除array之外,swap不会导致元素拷贝、删除、插入。swap后,string的迭代器会失效,数组的迭代器会指向原来的位置(但是元素已经被置换了),而其它的迭代器也会被置换(各自仍指向原来被换的元素)。

? ?

? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 10:59> </span></span> 比较

? ?

? ? ? ? 容器比较必须保证元素类型和容器类型是相同的,并且只有元素也定义了比较运算才能使用运算符号对容器进行比较。

? ?

? ? -? 9.3 容器操作

? ? ? ? 插入相关

? ? ? ?

? ? ? ? ? ? //尾部追加,forwardlist不支持

? ? ? ? ? ? c.push_back(t);//值为t的元素

? ? ? ? ? ? c.emplace_back(args);//args创建的元素

? ? ? ? ? ?

? ? ? ? ? ? //头部创建,vector与string不支持

? ? ? ? ? ? c.push_front(t);

? ? ? ? ? ? c.emplace_front(args);

? ? ? ? ? ?

? ? ? ? ? ? //指定位置之前的插入,forwardlist不支持下面的而是有自己专用的insert和emplace

? ? ? ? ? ? c.insert(p,t);//在p迭代器对应元素之前插入值为t的元素

? ? ? ? ? ? c.emplace(p,args);

? ? ? ? ? ? c.insert(p,n,t);//n个值为t的元素

? ? ? ? ? ? c.insert(p,b,e);//迭代器范围[b,e)

? ? ? ? ? ? c.insert(p,il);//花括号元素列表il

? ? ? ?

? ? ? ? ? ? 对象插入或初始化容器后,容器中的对应元素与对象并无关系,对象只是拷贝,类似传值调用。

? ? ? ?

? ? ? ? ? ? emplace直接在容器管理的空间中创建对象而不拷贝对象,emplace参数必须与元素类型构造函数参数匹配,

? ? ? ?

? ? ? ? 访问相关

? ? ? ?

? ? ? ? ? ? 访问成员函数返回的是引用

? ? ? ? ? ? front()是首元素(begin()),back是尾元素(end()-1),forwardlist不支持back();

? ? ? ? ? ? c.front(),c.back();

? ? ? ? ? ?

? ? ? ? ? ? 下标操作和at()可以随机访问,下标需要程序员自己注意越界情况,而at()会在越界的时候自动抛出相关的out_of_range错误

? ? ? ? ? ? c[n],c.at(n);

? ? ? ?

? ? ? ? 删除相关

? ? ? ?

? ? ? ? ? ? //forwardlist不支持erase,它有自己专用的删除函数

? ? ? ? ? ? //下面操作改变容器大小所以不支持array

? ? ? ? ? ? c.pop_back();//删除尾元素,forwardlist不支持

? ? ? ? ? ? c.pop_front();//删除首元素,vector和string不支持

? ? ? ? ? ?

? ? ? ? ? ? c.erase(p);//删除p所指向的元素(p是迭代器)

? ? ? ? ? ? c.erase(b,e);//删除[b,e)范围内的元素

? ? ? ? ? ? c.clear();//删除所有元素

? ? ? ?

? ? ? ? forwardlist特殊的函数

? ? ? ?

? ? ? ? ? ? //特殊的迭代器

? ? ? ? ? ? lst.before_begin();//首元素之前不存在的元素迭代器

? ? ? ? ? ? lst.cbefore_begin();

? ? ? ? ? ?

? ? ? ? ? ? //特殊的插入

? ? ? ? ? ? lst.insert_after(p,t);

? ? ? ? ? ? lst.insert_after(p,n,t);

? ? ? ? ? ? lst.insert_after(p,b,e);

? ? ? ? ? ? lst.insert_after(p,il);

? ? ? ? ? ?

? ? ? ? ? ? emplace_after(p,args);

? ? ? ? ? ?

? ? ? ? ? ? //特殊的删除

? ? ? ? ? ? lst.erase_after(p);

? ? ? ? ? ? lst.erase_after(b,e);

? ?

? ? -? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-14 二 11:50> </span></span> 9.3.5改变容器大小

? ? ? ?

? ? ? ? ? ? c.resize(n);

? ? ? ? ? ? c.resize(n,t);

? ?

? ? -? 9.3.6 容器操作可能会使迭代器失效

? ? ? ?

? ? ? ? ? ? 插入、删除都可能导致容器迭代器失效,不同容器情况不同(比如vector、list等)具体参考相关位置。

? ? ? ? ? ?

? ? ? ? ? ? 大致情况如下:

? ? ? ? ? ? 对于插入,

? ? ? ? ? ? 指向list/forwardlist的引用、指针、迭代器都不会失效;

? ? ? ? ? ? vector/string若重新分配则指针、引用、迭代器全失效,若未重新分配则插入之前的引用、指针、迭代器不会失效;

? ? ? ? ? ? deque插入首尾之外则指针、引用、迭代器全失效,插入首尾则迭代器失效但是指向存在的指针、引用不会失效。

? ? ? ? ? ?

? ? ? ? ? ? 对于删除,

? ? ? ? ? ? 指向被删元素的迭代器、指针、引用全都失效;

? ? ? ? ? ? 指向list/forwardlist其它位置的引用、指针、迭代器都不会失效;

? ? ? ? ? ? deque删除首尾之外则其它元素指针、引用、迭代器全失效,删除尾部则尾后迭代器失效其它不失效,删除首部则其它都不会被影响。

? ? ? ? ? ? 指向vector/string被删除元素之前的指针、引用、迭代器都有效。

? ? ? ? ? ? 只要删除元素,尾后迭代器都失效。

? ? ? ?

? ? ? ? ? ? 对于vector/string/deque,为防止失效,循环中操作容器后需要更新迭代器、引用、指针。

? ? ? ? ? ? insert()/erase()均会返回新迭代器,用它更新迭代器即可。

? ? ? ? ? ? 类似如下这样进行:

? ? ? ? ? ? inter= vi.insert(...);

? ? ? ? ? ? inter= vi.erase(....);

? ? ? ? ? ?

? ? ? ? ? ? 不要在循环外保存c.end()返回的尾迭代器做为判断,而直接每次使用新的返回值

? ? ? ? ? ? 类似如下这样进行:

? ? ? ? ? ? while(begin != v.end())

? ? ? ? ? ? {...}

? ?

? ? -? 9.4 vector对象是如何增长的

? ? ? ?

? ? ? ? ? ? vector元素连续,增加元素会导致重新分配空间,移动所有元素,所以通过一定策略预先给它分配多余的预留空间,防止频繁移动所有元素。

? ? ? ? ? ? capacity()告诉我们不重新分配内存(扩张)的情况下可以容纳多少个元素;reserve告诉我们它应当预留准备保存的元素数目。

? ? ? ? ? ? c.shrink_to_fit();//将capacity减少到与size(即实际的元素数)同样大小。

? ? ? ? ? ? c.capacity();//最大能保存的元素数目,超过则重新分配内存。

? ? ? ? ? ? c.reserve(n);//预留n的空间,不改变容器元素数量,仅影响vector预先分配多大的空间。

? ? ? ? ? ?

? ? ? ? ? ? 当需求大于当前容量,reserve才会改变vector容量,至少会分配与需求一样大的空间;当需求小于等于当前容量,reservse什么都不做并且小于时也并不会退回多余的空间。当调用reserve之后,capacity空间大小会大于等于传给reserve的参数。

? ? ? ? ? ?

? ? ? ? ? ? 总之,reserve不会减少容器占用的空间。类似地,resize只减少容器元素数目而不是容器容量,也不能用它减少预留空间。

? ? ? ? ? ?

? ? ? ? ? ? shrink_to_fit()会要求退回多余空间,但是实际也不保证一定退回。

? ? ? ?

? ? ? ? <span class="timestamp-wrapper"><span class="timestamp"><2020-01-19 日 12:15> </span></span> capacity和size

? ?

? ? -? <span class="timestamp-wrapper"><span class="timestamp">[2020-03-17 二 11:48] </span></span> 9.5额外的string操作

? ? ? ?

? ? ? ? ? ? 创建函数:使用const char*创建string对象时,如果未指定创建的大小或者指定的大小大于const char*字符数目,那么const char*必须以NULL空字符结束,否则不用。

? ? ? ? ? ? string(s), string(s,pos), string(s,pos,n)

? ? ? ? ? ? substr(pos), substr(pos,n)

? ? ? ? ? ?

? ? ? ? ? ? 修改字符串的操作:insert(),erase(),assign(),append(),replace()

? ? ? ? ? ?

? ? ? ? ? ? 搜索函数:返回string:size_typ类型,是下标,没有匹配则返回最大值npos的static成员。

? ? ? ? ? ? find(),rfind(),find_first_of(),find_last_of(),find_first_not_of(),find_last_not_of()

? ? ? ? ? ?

? ? ? ? ? ? 比较函数: compare()

? ? ? ? ? ?

? ? ? ? ? ? 数值转换:to_string(val),stoi(),stol(),stoul(),stoll(),stoull(),stof(),stod(),stold()

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • - [2020-01-10 五 11:53] 第9章 顺序容器 vector,随机访问、大...
    QuietHeart阅读 394评论 0 2
  • 顺序容器概述 C++标准库中的顺序容器为程序员提供了控制元素存储和顺序访问元素的能力,包括vector,strin...
    土豆吞噬者阅读 611评论 0 0
  • 第9章 顺序容器 9.1 顺序容器概述 1. 顺序容器类型 顺序容器描述vector可变大小数组string与ve...
    北冥有鱼wyh阅读 239评论 0 1
  • 所谓的顺序容器即元素在顺序容器中的顺序与其加入容器时的位置相对应。标准库还定义了几种关联容器,关联容器中元素的位置...
    梦中睡觉的巴子阅读 317评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,518评论 16 22