【STL】利用map快速查找vector

可以使用vector动态数组来存储原始信息,当需要查找的时候如果直接查找的话要一个一个的从头开始遍历,效率较低,借助map的键值对的特点,我们可以利用map来建立索引。
实现方法:在建立vector的同时,也同时将该元素插入到map容器中,map的first是待查找的关键字,second是该元素在vector中的下标。

如果是在导入数据时建立map,可以按照下面这样写:

vector.push_back(element);
mapname.insert(make_pair(element.getSname(), vector.size() - 1));

如果是在处理过程中构造或者重构map,按照以下的方式写:

	map1.clear();
	map2.clear();
	vector<T>::iterator it, first = vector.begin();
	for (it = vector.begin(); it != vector.end(); it++)
	{
		map1.insert(make_pair(it->getSname(), distance(first, it)));
		map2.insert(make_pair(it->getSno(), distance(first, it)));
		//map1.insert(make_pair(it->getSname(), it - vector.begin()));
		//map2.insert(make_pair(it->getSno(), it - vector.begin()));
	}

在查找时,如果结果唯一:

void Operation::findBookById(string id)
{
	multimap<string, int>::iterator it;
	it = bookid.find(id);//bookid是存有书号的map
	if (it == bookid.end())
		return;
	else
		cout << book[it->second];//book是存有所有书籍的vector
}

如果结果不唯一:要用到lower_bound(满足条件的下界)和upper_bound(满足条件的下界)然后遍历lower_bound到upper_bound之间

void Operation::findBookByName(string name)
{
	multimap<string, int>::iterator it, p1, p2, p;
	it = bookname.find(name);//bookname是存有书名的map
	if (it == bookname.end())
		return;
	else {
		p1 = bookname.lower_bound(name);
		p2 = bookname.upper_bound(name);
		for (p = p1; p != p2; p++) {
			cout << book[p->second] << endl;
		}
	}
}

要注意:一旦vector发生变化(如删除了元素或者修改了元素的关键字),对应的map一定要相应变化,否则会使得map与vector之间不对应,查找时候会产生错误
而一般如果删除了元素,map是进行重构;如果修改了关键字,map将此元素删除后再在map的后面insert一个新的元素即可,因为map自带自动排序功能。

void Operation::rebuildBookMap()
{
	bookname.clear();
	bookid.clear();
	vector<Book>::iterator it, first = book.begin();
	for (it = book.begin(); it != book.end(); it++)
	{
		bookname.insert(make_pair(it->getBname(), distance(first, it)));
		bookid.insert(make_pair(it->getIsbn(), distance(first, it)));
		//bookname.insert(make_pair(it->getBname(), it-book.begin()));
		//bookid.insert(make_pair(it->getIsbn(), it - book.begin()));
	}
}
void Operation::modifyBook(string id)
{
	multimap<string, int>::iterator it;
	vector<Book>::iterator first = book.begin();
	string pre;
	it = bookid.find(id);
	if (it == bookid.end())
		return;
	else
	{
		pre = book[it->second].getIsbn();
		cin >> book[it->second];
		int index = it->second;
		if (book[it->second].getIsbn() != pre)
		{

			bookid.erase(it);
			bookid.insert((make_pair(book[index].getIsbn(), index)));
		}
		cout << book[index];
	}

}

你可能感兴趣的:(程序设计基础)