#include <iostream>
#include<map>
using namespace std;
map<int, int>g_OnMic;
int main()
{
for (int i = 0; i < 10;i++)
{
g_OnMic.insert(make_pair(i, i));
}
map<int, int>::iterator iter;
for (iter = g_OnMic.begin(); iter != g_OnMic.end(); /*iter++*/)
{
if (iter->second == 9)
{
g_OnMic.erase(iter++);
}
else
iter++;
}
return 0;
}
// webrc中删除map中的指定value
std::map<uint32_t, VideoSendStream*> video_send_ssrcs_;
VideoSendStream* send_stream_impl = nullptr;
auto it = video_send_ssrcs_.begin();
while (it != video_send_ssrcs_.end()) {
if (it->second == static_cast<VideoSendStream*>(send_stream)) {
send_stream_impl = it->second;
video_send_ssrcs_.erase(it++);
} else {
++it;
}
}
//另一种删除方式,vector
std::vector<MessageQueue *>::iterator iter;
iter = std::find(message_queues_.begin(), message_queues_.end(),
message_queue);
if (iter != message_queues_.end()) {
message_queues_.erase(iter);
}
destroy = message_queues_.empty();
//遍历删除vector中所有元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> m_vecINT = { 1, 2, 3, 4, 5, 6, 7, 8 };
vector<int>::iterator iter = m_vecINT.begin();
while (iter!=m_vecINT.end())
{
iter = m_vecINT.erase(iter);
}
return 0;
}
关于erase后迭代器失效的原因 ,参考文章分析的特别好
参考文章vector迭代器失效解决方法 及 内存原理_Kuro同学的博客-CSDN博客_vector迭代器失效
//erase操作
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int>q{1,2,3,4,5,6,7,8,9,10};
int cnt = 0;
int flag = 0;
for(vector<int>::iterator i = q.begin(); i != q.end(); ++i){
++cnt;
if(cnt > 15){
cout<<"gg"<<endl;
break;
}
if(*i == 3) //删除第三个
i = q.erase(i);
cout << *i << endl;
cout << &(*i) << endl;
}
return 0;
}
1
0xc72158
2
0xc7215c
4
0xc72160
5
0xc72164
6
0xc72168
7
0xc7216c
8
0xc72170
9
0xc72174
10
0xc72178
输出结果分析:
当删除第3个元素以后我们发现第四个元素是紧邻第二个元素的(刚好差一个int的内存)
也就是说vector执行erase(i)后会将迭代器i之后的元素逐个向前移动一个type单位
这也就是i及i之后所有迭代器失效的原因…
insert操作(内存不足时)
//insert操作
//内存不够情况
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int>q{1,2,3,4,5,6,7,8,9,10}; // c++11列表初始化
vector<int>::iterator j = q.begin();
j++;
cout<<"第二个元素:"<<*j<<endl;
cout<<"第二个元素地址:"<<&(*j)<<endl;
cout<<"初始vector分配的容量:"<<q.capacity()<<endl; // 有多少元素即分配多少内存
int cnt = 0;
int flag = 0; //flag保证只插入一次
for(vector<int>::iterator i = q.begin(); i != q.end(); ++i){
++cnt;
if(cnt > 15){
cout<< "gg" <<endl;
break;
}
if(*i == 3&&!flag){
flag = 1;
i = q.insert(i,22);
cout<<"\n插入后第二个元素:"<<*j<<endl;
cout<<"插入后第二个元素地址:"<<&(*j)<<endl;
cout<<"插入元素后vector分配的容量:" <<q.capacity() <<endl;
}
cout << *i << endl;
cout << &(*i) << endl;
}
return 0;
}
Output
第二个元素:2
第二个元素地址:0xe5215c
初始vector分配的容量:10
1
0xe52158
2
0xe5215c
插入后第二个元素:15007936
插入后第二个元素地址:0xe5215c
插入元素后vector分配的容量:20
22
0xe52190
3
0xe52194
4
0xe52198
5
0xe5219c
6
0xe521a0
7
0xe521a4
8
0xe521a8
9
0xe521ac
10
0xe521b0
输出结果分析:
vector内存分配策略为 二倍扩容 , 每次当内存不够的情况下vector会将容量扩展为当前的两倍.
那这些新分配的会在原内存的后面吗? 根据输出结果显然不是的。
上例代码在插入元素22 后, 新的3号元素内存位置距离上一个元素不是4byte(1个int单位), 也就是说
当vector扩容时, 会在另一个内存分配一段新的内存(原内存的二倍). 并把原内存中的元素全部拷贝到新内存中…
指向二号元素的迭代器在插入操作之后指向的值由2变成了15007936,也验证了上述结论.
//insert操作
//内存充足情况
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int>q{1,2,3,4,5,6,7,8,9,10};
q.push_back(11);
cout<<"初始vector分配的容量:"<<q.capacity()<<endl;
int cnt = 0;
int flag = 0; //flag保证只插入一次
for(vector<int>::iterator i = q.begin(); i != q.end(); ++i){
++cnt;
if(cnt > 15){
cout<< "gg" <<endl;
break;
}
if(*i == 3&&!flag){
flag = 1;
i = q.insert(i,22);
cout<<"插入元素后vector分配的容量:" <<q.capacity() <<endl;
}
cout << *i << endl;
cout << &(*i) << endl;
}
return 0;
}
output:
初始vector分配的容量:20
1
0x1f2188
2
0x1f218c
插入元素后vector分配的容量:20
22
0x1f2190
3
0x1f2194
4
0x1f2198
5
0x1f219c
6
0x1f21a0
7
0x1f21a4
8
0x1f21a8
9
0x1f21ac
10
0x1f21b0
11
0x1f21b4