map容器的insert用法总结

例子:

#include 
#include 
#include 
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map imap;
	map jmap;
	jmap[1] = 1;
	jmap[2] = 2;
	imap.insert(jmap.begin(), jmap.end());
	map::iterator iter = imap.begin();
	for (; iter != imap.end(); iter++)
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	getchar();
	return 0;
}

运行结果如下:

iter->first: 1, iter->second: 1
iter->first: 2, iter->second: 2

注意: insert(iter1, iter2)返回值是void


例子:

#include 
#include 
#include 
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map jmap;
	jmap[1] = 1;
	jmap[2] = 2;
	pair::iterator, bool> pret = jmap.insert(pair(3, 3));
	printf("pret.second: %d, pret.first->first: %d, pret.first->second: %d\n", pret.second, pret.first->first, pret.first->second);
	pret = jmap.insert(pair(1, 1));
	printf("pret.second: %d, pret.first->first: %d, pret.first->second: %d\n", pret.second, pret.first->first, pret.first->second);
	getchar();
	return 0;
}


运行结果为:

pret.second: 1, pret.first->first: 3, pret.first->second: 3
pret.second: 0, pret.first->first: 1, pret.first->second: 1

分析:insert(pair<...>) 版本返回值是一个pair结构,其中第一个元素是一个迭代器,第二个元素是一个bool类型,根据以上结果:如果原来的map中不含有插入的元素,则bool为true,迭代器指向插入的元素;如果map中已经含有插入的元素了,则bool为false,返回的迭代器指向对应的map中已经存在的元素


例子:

#include 
#include 
#include 
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map imap;
	map jmap;
	jmap[1] = 1;
	jmap[2] = 2;
	imap.insert(jmap.begin(), jmap.end());
	map::iterator ret = imap.insert(imap.begin(), pair(1, 1));
	printf("ret->first: %d, ret->end: %d\n", ret->first, ret->second);
	ret = imap.insert(imap.begin(), pair(3, 3));
	printf("ret->first: %d, ret->end: %d\n", ret->first, ret->second);
	getchar();
	return 0;
}
运行结果为:

ret->first: 1, ret->end: 1
ret->first: 3, ret->end: 3
分析:insert(iter, pair<...>)返回一个指向插入元素的迭代器,如果map中已经存在元素,则返回的迭代器指向原先map中已经存在的元素


例子:

#include 
#include 
#include 
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map kmap;
	//std::initializer_list > list = { pair(10, 10), pair(20, 20), pair(30, 30) }; //error
	kmap.insert({ pair(10, 10), pair(20, 20), pair(30, 30) });
	map::iterator iter = kmap.begin();
	for (; iter != kmap.end(); iter++)
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	//MapInsert();
	getchar();
	return 0;
}


运行结果为:

iter->first: 10, iter->second: 10
iter->first: 20, iter->second: 20
iter->first: 30, iter->second: 30

分析:这里的insert是使用void insert(_XSTD initializer_list _Ilist)这个重载版本的,返回值为void,在外面定义initializer_list再传进去会出错,不知道为什么。


例子:

#include 
#include 
#include 
#include 
using namespace std;

class People
{
public:
	People(const char* name, int age)
	{
		printf("constructor People\n");
		strcpy(m_name, name);
		m_age = age;
	}
	virtual ~People()
	{
		printf("destructor People\n");
	}

public:
	virtual void Print() = 0;

protected:
	char m_name[10];
	int m_age;
};

class Stu: public People
{
public:
	Stu(const char* name, int age) : People(name, age)
	{
		printf("constructor Stu\n");
	}
	~Stu()
	{
		printf("destructor Stu\n");
	}

public:
	void Print()
	{
		printf("This is Stu Print, name: %s, age: %d\n", m_name, m_age);
	}
};

class Worker : public People
{
public:
	Worker(const char* name, int age) : People(name, age)
	{
		printf("constructor worker\n");
	}
	~Worker()
	{
		printf("destructor worker\n");
	}

public:
	void Print()
	{
		printf("This is Worker Print, name: %s, age: %d\n", m_name, m_age);
	}
};

void MapInsert()
{
	typedef map >::iterator Iterator;
	typedef pair > Pair;
	pair stu_pair[3] = { make_pair("Peter", 10), make_pair("Rei", 14), make_pair("Kai", 16)};
	pair wor_pair[3] = { make_pair("Jet", 20), make_pair("Piker", 24), make_pair("Ein", 26) };
	map > insert_map;
	for (int i = 0; i < 3; i++)
		pair ret = insert_map.insert(Pair(stu_pair[i].first, make_shared(stu_pair[i].first.c_str(), stu_pair[i].second)));
	for (int i = 0; i < 3; i++)
		pair ret = insert_map.insert(Pair(wor_pair[i].first, make_shared(wor_pair[i].first.c_str(), wor_pair[i].second)));

	Iterator iter = insert_map.begin();
	for (; iter != insert_map.end(); iter++)
	{
		printf("%s: ", iter->first.c_str());
		iter->second->Print();
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	MapInsert();
	getchar();
	return 0;
}
运行结果如下:

constructor Stu
constructor People
constructor worker
constructor People
constructor worker
constructor People
constructor worker
Ein: This is Worker Print, name: Ein, age: 26
Jet: This is Worker Print, name: Jet, age: 20
Kai: This is Stu Print, name: Kai, age: 16
Peter: This is Stu Print, name: Peter, age: 10
Piker: This is Worker Print, name: Piker, age: 24
Rei: This is Stu Print, name: Rei, age: 14
destructor Stu
destructor People
destructor worker
destructor People
destructor Stu
destructor People
destructor Stu
destructor People
destructor worker
destructor People
destructor worker
destructor People

分析:map中插入不同于map指定的元素类别的时候,如果插入的类别可以转换成map允许插入的类别的话,map会帮你自动转换,如果不能转换则不能插入

map imap;

imap.insert(pair(10, 10.2))     //可以插入,但会损失精度

imap.insert(pair(10.1, 'c'))  //可以插入,同样会损失精度

imap.insert(pair(10, "s"))       //编译出错

你可能感兴趣的:(stl的使用)