分类: C/C++
2013-01-28 11:01:55
Chapter 9 Sequential Containers
1.新增了array与forward_list顺序容器,前者相当于C中数组,后者为单链表。
array的特点是定长,不能add/remove新元素;forward_list没有size接口,因为这将导致遍历元素,开销不确定,同时其它顺序容器的size接口应该是被重写了,SBL说它们现在比以前效率高了,例如list的size复杂性从以前的线性到现在的常数级(其它的好像都是常数级,额)。SBL又建议了一遍,不要使用C中数组那些原始的数据结构啦~
2.cbegin和cend函数返回的const迭代器,前面总结过了,不需要改写的时候用这个。
3.容器的list initialization,大括号的那种形式,这个回头得好好总结回顾下,多次提到了这个形式。
4.看到了点array的东西,写一下:
其模板带2个参数,除了类型还有容量:array
所以在定义其迭代器时也不要忘了给出容量。
由于其容量固定,创建该容器时,如果没有给出初始化数据,那么元素将被初始化为默认值。
array类型的变量可以互相赋值,array
5.交换元素的std::swap,过去也有啊,没错,但过去都是成员函数像std::vector::swap,这次新增了更为抽象的模板。
老的成员函数版本怎么实现的有点忘了,新的std::swap只是交换容器内部的堆区的指针(array除外),所以复杂度是常数级,SBL更推荐使用这个。由于是交换内部指针,故老的迭代器没有失效,只是指向了已经归属另一个容器的该元素。
6. insert函数现在返回指向被插入的那个元素,如果是插入多个元素,则指向第一个。循环迭代什么的可以省点代码。
7. emplace操作。如下假设容器c持有的元素Sales_data有一个3个参数的构造函数
c.emplace_back("978-0590353403", 25, 15.99); // error: there is no version of push_back that takes three arguments c.push_back("978-0590353403", 25, 15.99); // ok: we create a temporary Sales_data object to pass to push_back c.push_back(Sales_data("978-0590353403", 25, 15.99));emplace_back将直接在容器c中尾部位置根据入参创建一个Sales_data对象,第三行的显示调用则是先创建一个临时对象,再复制到c的尾部。
还有emplace_front对应push_front;emplace对应insert。
8. shrink_to_fit,vector,deque,string特有,看名字就知让容器缩水,当前容器的sizes是15,capacity是20,调用这个成员函数后,容器可能会释放掉5个元素的存储空间。注意是可能,换句话讲是提出的一个请求,各编译器根据实际情况进行处理。
9. string与数值的转换。
新增的std::to_string可以将数值转换为string。很像c中那个sprintf
int main() { double f = 23.43; std::string f_str = std::to_string(f); std::cout << f_str << '\\n'; }结果是23.430000.
string转数值有std::stoi;std::stod等等了,按需使用。注意可能的异常:
std::invalid_argument if no conversion could be performed
std::out_of_range if the converted value would fall out of the range of the result type.