以下内容参考Effective STL和Effective Modern C++
1. map和set是按key排序的,不是按插入顺序排序的
现在更推荐用QVector而不是QList
2. vector查找方便,list增删方便,set介于两者之间
3. 容器分类:
顺序容器(连续内存):vector,string,deque
关联容器:map,set,multimap,multiset
4. 容器删除操作:
顺序容器删除操作:
for (SeqContainer<int>::iterator i = c.begin();
i != c.end();){
if (badValue(*i)){
logFile << "Erasing " << *i << '\n';
i = c.erase(i);
}
else ++i;
}
关联容器删除操作:
for (AssocContainer<int>::iterator i = c.begin();
i !=c.end();){
if (badValue(*i)){
logFile << "Erasing " << *i <<'\n'; // write log file
c.erase(i++); // erase element
}
else ++i;
}
自从C++11后,已经统一删除操作了,关联容器也可以使用i = c.erase(i);来删除元素
5. STL容器的删除:
(1)顺序容器具有remove函数,删除满足条件的元素,后面的元素(逻辑end)往前移,但实际物理大小不变。
逻辑end之后的元素仍然保持原来的值,只有在调用erase之后在将逻辑end之后的内存释放,这时候物理end匹配逻辑end。
std::remove返回逻辑end
remove不能真正的删除元素
c.erase(std::remove(c.begin(), c.end(), 1963), c.end());
(2)list删除元素:唯一一个用remove能真正删除元素的容器
c.remove(1963); //删除list中所有值为1963的元素,list::remove也是调用的erase
(3)关联容器删除元素:
c.erase(1963);
关联容器(map,set,multimap,multiset)没有remove函数,map如果使用remove算法可能会重写容器的值
6. vector
vector::size 元素数量
vector::capacity 容器能容纳的元素数量
vector::resize(n) 修改元素数量
vector::reserve(n) 当n大于capacity的时候,reallocate(alloc,copy,destruct,dealloc)
为了避免vector reallocate,有两种方法:
1. 预先reserve足够大小
2. 先reserve再缩小
取C风格数组或字符串:
vector v;
&v[0]
string s;
s.c_str();
使用vector和string替代动态数组和const char*
vector,string缩小capacity到size
vector<Contestant>(contestants).swap(contestants);
string(s).swap(s);