Container Operator Summary

容器操作汇总

                   – functions prsent in C++03
                   – functions prsent since C++11
                   – functions prsent since C++17

      Sequence ContainersAssociative ContainersUnordered Associative ContainersContainer Adaptors
  Header <array><vector><deque><forward_list><list><set><map><unordered_set><unordered_map><stack><queue>
  Container arrayvectordequeforward_listlistsetmultisetmapmultimapunordered_setunordered_multisetunordered_mapunordered_multimapstackqueuepriority_queue
  (constructor) (implicit) vectordequeforward_listlistsetmultisetmapmultimapunordered_setunordered_multisetunordered_mapunordered_multimapstackqueuepriority_queue
 (destructor) (implicit) ~vector ~deque~forward_list~list~set~multiset~map~multimap~unordered_set~unordered_multiset~unordered_map~unordered_multimap~stack~queue~priority_queue
operator=(implicit) operator=operator=operator=operator=operator=operator=operator=operator=operator=operator=operator=operator=operator=operator=operator=
assign  assignassignassignassign           
Iteratorsbegin begin beginbeginbeginbeginbeginbeginbeginbeginbeginbeginbeginbegin   
 cbegin cbegincbegin cbegincbegincbegincbegincbegincbegincbegincbegincbegincbegincbegin   
endend endendendendendendendendendendendend   
cend cend cendcendcendcendcendcendcendcendcendcendcendcend   
rbeginrbegin rbeginrbegin rbeginrbeginrbeginrbeginrbegin       
crbeign crbegin crbegincrbegin crbegincrbegincrbegincrbegincrbegin       
rendrend rendrend rendrendrendrendrend       
crend crend crendcrend crendcrendcrendcrendcrend       
Element Accessat at  atat    at    at    
 operator[] operator[] operator[]operator[]     operator[]   operator[]    
front front  frontfrontfrontfront          fronttop
 backback  backback back         topback 
Capacity empty empty  emptyemptyemptyemptyemptyemptyemptyemptyemptyemptyemptyemptyemptyemptyempty
 size size sizesize sizesizesizesizesizesizesizesizesizesizesizesize
max size max_size max_size max_sizemax_sizemax_sizemax_sizemax_sizemax_sizemax_sizemax_sizemax_sizemax_sizemax_size   
resize  resize resizeresizeresize           
capacity   capacity        bucket_countbucket_countbucket_countbucket_count   
reserve   reserve        reservereservereservereserve   
shrink to fit   shrink_to_fitshrink_to_fit             
Modifiersclear   clearclearclearclearclearclearclearclearclearclearclearclear   
 insert insert insertinsert_afterinsertinsertinsertinsertinsertinsertinsertinsertinsert   
emplace   emplaceemplaceemplace_afteremplaceemplaceemplaceemplaceemplaceemplaceemplaceemplaceemplace   
emplace hint       emplace_hintemplace_hintemplace_hintemplace_hintemplace_hintemplace_hintemplace_hintemplace_hint   
erase   eraseeraseeraseeraseeraseeraseeraseeraseeraseeraseeraseerase   
push front   push_front push_frontpush_front           
emplace front    emplace_frontemplace_frontemplace_front           
pop front    pop_frontpop_frontpop_front          poppop
push back   push_backpush_back push_back         pushpushpush
emplace back   emplace_backemplace_back emplace_back         emplaceemplaceemplace
pop back   pop_backpop_back pop_back         pop  
 swapswap  swapswapswapswapswapswapswapswapswapswapswapswapswapswapswap
merge     mergemergemergemergemergemergemergemergemergemerge   
extract       extractextractextractextractextractextractextractextract   
List Operationssplice    splice_after splice           
 remove    removeremove           
 remove if    remove_ifremove_if           
 reverse    reversereverse           
 unique    uniqueunique           
 sort    sortsort           
Lookup count      countcount countcount countcountcountcount   
 find      findfindfindfind findfindfindfind   
lower bound       lower_boundlower_boundlower_boundlower_bound       
upper bound       upper_boundupper_boundupper_boundupper_bound       
equal range       equal_rangeequal_rangeeuqal_rangeequal_rangeequal_range equal_rangeequal_rangeequal_range   
Observers key comp     key_comp key_compkey_compkey_comp       
 value comp      value_compvalue_compvalue_compvalue_comp       
hash function           hash_functionhash_functionhash_functionhash_function   
key eq           key_eqkey_eqkey_eqkey_eq   
Allocator get allocator   get_allocatorget_allocatorget_allocatorget_allocatorget_allocatorget_allocatorget_allocatorget_allocatorget_allocatorget_allocatorget_allocatorget_allocator   
 Container arrayvectordequeforward_listlist setmultisetmapmultimapunordered_setunordered_multimsetunordered_map unordered_multimap stackqueuepriority_queue
  Sequential Containers     Associative Containers    Unordered Associative Containers    Container Adaptors   

 

注意事项

  1. 关联容器和array不支持接受元素个数的构造函数,e.g. C<T> c(n)。没有默认构造函数的类在使用接受元素个数的容器构造函数时,必须提供初始值,e.g. C<T> c(n, init)
  2. 关联容器和array不支持assign成员函数。
  3. 操作符=必须满足容器类型和元素类型相同,而assign可以是不同的容器类型,而且元素类型能够互相转换即可。
  4. 除了array之外,swap不对任何元素进行拷贝、删除或插入操作,因此可以保证在常数时间内完成。同时意味着,除了string之外,swap之后,指向容器的迭代器、指针和引用不会失效,只是这些元素不属于原来的容器了。
  5. swap的两个对象必须保证容器类型和元素类型相同。这意味着,对于array容器来讲,除了元素类型相同之外,大小也必须相同。
  6. 既有成员函数swap,也有泛化编程函数swap。推荐使用泛化编程函数swap。
  7. forward_list支持empty和max_size,但是不支持size。
  8. 所有的容器(顺序,关联,有序,无序)都支持==和!=,除了无序关联容器之外的所有容器都支持关系运算符(>、>=、<、<=)。关系运算符两边必须是相同容器类型和相同元素类型。另外一点限制是,必须容器内的元素类型定义了相应的比较运算符时,我们才能使用关系运算符比较两个容器。
  9. 在调用front(所有顺序容器)和back(除了forword_list的所有顺序容器)或者解引用begin和–end()(所有非容器适配器的容器,其中–end()不适用于forward_list)时,必须保证容器非空。需要调用empty(所有容器都有)判断一下。
  10. at(n),当n越界时,抛出out_of_range异常。而front/back/[]的行为是未定义的,而不会抛出异常。
  11. front/back/at/[]返回的都是引用,但是如果想使用auto变量保存这些函数的返回值,且想通过auto变量改变元素的值,必须在auto后面加上&。
  12. pop_front和pop_back返回值为void,如果想使用pop出来的值,必须先调用front或back来保存将要被pop出去的值。同样在调用front和back的时候调用empty判断容器是否非空。
  13. vector,string,deque,list的insert成员返回第一个新插入元素的迭代器,而forword_list的insert_after成员返回的是最后一个插入元素的迭代器。
  14. vector,string,deque,list的erase成员和forward_list的erase_after成员都返回最后一个删除元素之后的一个迭代器。
  15. 为了支持forward_list的erase_after和insert_after成员,forward_list提供了一个名为before_begin()的成员,返回首前迭代器。该迭代器和尾后迭代器一样不可解引用。
  16. deque的实现原理请参看:STL源码剖析——deque的实现原理和使用方法详解
  17. 增加任何元素都将使deque的迭代器失效。在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时,只有指向该元素的迭代器失效。
  18. 迭代器失效请参见:STL的erase()陷阱-迭代器失效总结
  19. 当我们添加/删除vector/string的元素后,或在deque中首元素之外的位置添加/删除元素之后,原来end返回的尾后迭代器总是会失效。因此添加或删除元素的循环流程必须反复调用end成员,而不能使用在循环之前保存的end返回值。通常C++标准库中的end执行都很快,部分就是因为这个原因。
  20. shrink_to_fit不一定保证回退内存空间。
  21. string的find函数返回的是std::string::size_type类型的值,为unsigned的,因此接收find返回值的类型也应该是stad::string::size_type类型的。另外如果没有搜索到,find返回std::string::npos,被初始化为-1,实际值为任何string最大的可能大小。
  22. 可以实现stack的底层容器是vector, deque, list;可以实现queue的底层容器是deque, list;可以实现priority_queue的底层容器是vector, deque。默认情况下,stack和queue是基于deque实现的,而priority_queue是基于vector来实现的。

细节区分

Some class types also use copy initialization for the objects they allocate. For example, the library containers copy initialize their elements when we initialize the container, or when we call an insert or push member. By contrast, elements created by an emplace member are direct initialized.

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

19 + 13 =

67 + = 77