何时迭代器失效
如果向容器的插入和删除造成元素移动,迭代器就会失效;如果引起内存重新分配,那么就会全部失效。
emplace_back和push_back
push_back调用的是拷贝构造函数,而emplace_back调用的是构造函数。
c.emplace_back("1",2,3);
c.push_back("1",2,3); //xxx,不支持
c.push_back(Sales_data("1",2,3));
成员函数返回的是引用
什么at,front,back返回的都是引用,如果容器是const的,就返回const引用,否则是普通引用。
auto &a1 = c.back(); //a1是引用
auto a2 = c.back(); //a2 是c.back()的拷贝。
c[n]和c.at(n)
区别就是前者运行时报错,后者编译时报错。
vector<string> svec;
cout<<svec[0]; //xxx,运行出错
cout<<svec.at(0);
vector的增长
为了减小内存分配的次数,vector会预先分配大于需要的内存。capacity()代表真实的内存,size()代表占用的内存。reserve()改变capacity,resize()改变size。
适配器
stack,queue,priority_queue。适配器要满足的操作决定其可以构造于什么容器之上,比如queue需要back,push_back,front和push_front,所以只能通过list和deque,不能通过vector构造。
stack,queue默认deque,priority_queue默认vector,可以指定用什么容器。
stack<string,vector<string>> sstack;