可以使用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];
}
}