C++ STL容器笔记

以下内容参考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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值