使用多键映射进行有效搜索

时间:2014-09-02 05:46:32

标签: c++ search map

我有一张带有键的地图作为结构。 Struct(key)包含两个字符串x和y。

两个键可以具有相同的x值,但它们肯定会因y而不同。

我很想使用这两个键来最好地搜索价值。

1 个答案:

答案 0 :(得分:0)

map只应包含每个键值一次。这就是为什么它可以提供运算符[]来唯一地寻址一个特定的密钥。

如果您为同一个键设置了多个值,则应使用multimaps代替。使用多地图时,您必须使用find()来访问这些值。

您可以尝试这个小而非常基本的例子:

std::map<char, int> mymap;              // unique key 
std::multimap<char, int> mymulti;       // non-unique key 

mymap.insert(std::pair<char, int>('a', 10));        
mymap.insert(std::pair<char, int>('b', 15));
mymap.insert(std::pair<char, int>('b', 20));    // problem: will not be inserted !  
mymulti.insert(std::pair<char, int>('a', 10));
mymulti.insert(std::pair<char, int>('b', 15));
mymulti.insert(std::pair<char, int>('b', 20));  // no problem
mymulti.insert(std::pair<char, int>('c', 25));
std::cout << "First:\n";             // b is there only once
for (auto x : mymap) std::cout << x.first << ":" << x.second << "\n";
std::cout << "\nSecond:\n";           // b is ther twice
for (auto x : mymulti) std::cout << x.first << ":" << x.second << "\n";

std::cout << "first[b]=" << mymap['b'] << std::endl;    // map access (direct)
std::cout << "Second[b]={";                             // multimap access  (iterator)
for (auto x = mymulti.find('b'); x != mymulti.end() && x->first == 'b'; x++) std::cout << x->second << " ";
std::cout << "}\n";

地图和多地图通常都是作为二叉搜索树实现的。因此它对搜索有效。