#include <iostream>
#include <map>
using namespace std;
#include <stdio.h>
struct A
{
int x;
int y;
A(int v1, int v2) : x(v1), y(v2) {}
};
class B
{
public:
/*
* 情况1
* 带指针 通过new操作 带引用
* 输出: 正常输出
* 注意:erase 或者delete操作注意释放
* */
void push(std::map<int, A*>& _a)
{
A* a1 = new A(10, 20);
_a.insert(std::make_pair(10, a1));
A* a2= new A(1,2);
_a.insert(std::make_pair(3, a2));
A* a3= new A(4,2);
_a.insert(std::make_pair(5, a3));
}
/*
* 情况2
* 带指针 不通过new操作 直接在函数内取地址
* 输出:不正常
* 原因:函数结束后 临时栈地址释放掉
* */
void pushx()
{
A a1 = A(10, 20);
_a.insert(std::make_pair(10, &a1));
A a2= A(1,2);
_a.insert(std::make_pair(3, &a2));
A a3= A(4,2);
_a.insert(std::make_pair(5, &a3));
}
/*
* 情况3
* 不带指针
* 输出:正常
* inert 操作 相当于复制操作
* */
void pushxa(std::map<int, A>& _aa)
{
A a1 = A(10, 20);
_aa.insert(std::make_pair(10, a1));
A a2= A(1,2);
_aa.insert(std::make_pair(3, a2));
A a3= A(4,2);
_aa.insert(std::make_pair(5, a3));
}
/*
* 和情况2类似
* 区别 带引用
* */
void pushx(std::map<int, A*>& _a)
{
A a1 = A(10, 20);
_a.insert(std::make_pair(10, &a1));
A a2= A(1,2);
_a.insert(std::make_pair(3, &a2));
A a3= A(4,2);
_a.insert(std::make_pair(5, &a3));
}
void cout()
{
for(std::map<int, A*>::iterator it = _a.begin(); it != _a.end(); ++it)
{
printf("first==>%d \t second==> %d \t %d\n", it->first, it->second->x, it->second->y);
}
printf("AAAAAAAAAA\n");
for(std::map<int, A>::iterator it = _aa.begin(); it != _aa.end(); ++it)
{
printf("first==>%d \t second==> %d \t %d\n", it->first, it->second.x, it->second.y);
}
}
void erase()
{
std::map<int, A*>::iterator it = _a.find(5);
if(it == _a.end())
{
printf("not found\n");
return;
}
A* a = it->second;
if(it->second != NULL)
{
//delete(a);
}
_a.erase(it);
it->second = NULL;
printf("delete a==> a->x%d\t a->y%d\n",a->x,a->y);
/*
* 当new之后不进行delete后还可以继续作为新的A*进行插入数据
* */
//new
_a.insert(std::make_pair(12,a));
}
B() {
//pushx(_a);
//pushx();
//pushxa(_aa);
push(_a);
cout();
erase();
cout();
}
private:
std::map<int, A*> _a;
std::map<int, A> _aa;
};
int main()
{
B b;
return 0;
}