std::multimap<string, string〉 pets; // Element is pair{pet_type, pet_name} auto iter = pets.insert (std::pair<string, string>{string{"dog"}, string{"Fang"}}); iter = pets.insert(iter, std::make_pair("dog", "Spot")); // Insert Spot before Fang pets.insert(std::make_pair("dog", "Rover"));// Inserts Rover after Fang pets.insert (std::make_pair ("cat", "Korky"));// Inserts Korky before all dogs pets.insert ({{ "rat", "Roland"}, {"pig", "Pinky" }, {"pig", "Perky"}});//Inserts list elements第三条语句的第一个参数是一个作为提示符的迭代器,它说明了元素应该被插入的位置。元素会被立即插入到 iter 所指向元素的前面,因此,这使我们可以覆盖默认的插入位置。对于默认的插入位置来说,元素会被插入到先前插入的键为 "dog" 的元素的后面。元素默认是按照键的升序插入的。如果没有用提示符改变插入位置,有相同键的元素的位置和插入位置相同。最后一条语句插入了一些初始化列表中的元素。有高级版本的 insert(),它可以接收两个迭代器参数,用来指定插入元素的范围。
auto iter = pets.emplace("rabbit”,"Flopsy"); iter = pets.emplace_hint (iter, "rabbit", "Mopsy");// Create preceding Flopsy这两个函数都返回一个指向插入元素的迭代器。emplace_hint() 函数尽可能近地在第一个参数所指向位置的前面生成一个新元素。如果只使用 emplace() 来插入 "Mopsy",它可能会被插入到当前所有键为 "rabbit" 的元素的后面。
std::multimap<std::string, size_t> people {{"Ann",25},{"Bill", 46}, {"Jack", 77}, {"Jack", 32},{"Jill", 32}, {"Ann", 35} }; std::string name {"Bill"}; auto iter = people.find(name); if (iter ! = std::end (people)) std::cout << name << " is " << iter->second << std::endl; iter = people.find ("Ann"); if (iter != std::end(people)) std::cout << iter->first << " is " << iter->second <<std::endl;如果没有找到键,会返回一个结束迭代器,所以我们应该总是对返回值进行检查。第一个 find() 调用的参数是一个键对象,因为这个键是存在的,所以输出语句可以执行。第二个 find() 调用的参数是一个字符串常量,它说明参数不需要和键是相同的类型。对容器来说,可以用任何值或对象作为参数,只要可以用函数对象将它们和键进行比较。最后一条输出语句也可以执行,因为有等于 "Ann" 的键。事实上,这里有两个等于 "Ann" 的键,你可能也会得到不同的运行结果。
auto pr = people.equal_range("Ann"); if(pr.first != std::end(people)) { for (auto iter = pr.first ; iter != pr.second; ++iter) std:cout << iter->first << " is " << iter->second << std::endl; }equal_range() 的参数可以是和键同类型的对象,或是不同类型的但可以和键比较的对象。返回的 pair 对象的成员变量 first 是一个迭代器,它指向第一个大于等于参数的元素;如果键和参数相等的元素存在的话,它是第一个键和参数相同的元素。如果键不存在,pair 的成员变量 first 就是容器的结束迭代器,所以应该总是对它们进行捡查。
auto iter1 = people.lower_bound("Ann"); auto iter2 = people.lower_bound("Ann"); if(iter1 != std::end(people)) { for(auto iter = iterl ; iter != iter2; ++iter) std::cout << iter->first << " is " << iter->second << std::endl; }它和前一个代码段的输出结果是相同的。通过调用 multimap 的成员函数 count() 可以知道有多少个元素的键和给定的键相同。
auto n = people.count("Jack"); // Returns 2可以用不同的方式使用这些函数。可以选择 find() 或 equal_range() 来访问元素。如果以班级为键,在 mutilmap 中保存学生信息,可以用成员函数 count() 来获取班级的大小。当然,通过将在前面章节介绍的 distance() 函数模板运用到成员函数 equal_range() 返回的迭代器或者 lower_bound() 和 upper_bound() 返回的迭代器上,也可以获取键和给定键相等的元素 的个数:
std::string key{"Jack"}; auto n = std::distance( people.lower_bound(key),people.upper_bound(key)); // No. of elements matching key注意,全局的 equal_range()、lower_bound()、upper_bound() 函数模板的使用方式和关联容器中同名成员函数的使用方式略有不同。在教程后面的部分你会了解到这些。
// Using a multimap #include <iostream> // For standard streams #include <string> // For string class #include <map> // For multimap container #include <cctype> // For toupper() using std::string; using Pet_type = string; using Pet_name = string; int main() { std::multimap<Pet_type, Pet_name> pets; Pet_type type {}; Pet_name name {}; char more {'Y'}; while(std::toupper(more) == 'Y') { std::cout << "Enter the type of your pet and its name: "; std::cin >> std::ws >> type >> name; // Add element - duplicates will be LIFO auto iter = pets.lower_bound(type); if(iter != std::end(pets)) pets.emplace_hint(iter, type, name); else pets.emplace(type, name); std::cout << "Do you want to enter another(Y or N)? "; std::cin >> more; } // Output all the pets std::cout << "\nPet list by type:\n"; auto iter = std::begin(pets); while(iter != std::end(pets)) { auto pr = pets.equal_range(iter->first); std::cout << "\nPets of type " << iter->first << " are:\n"; for(auto p = pr.first; p != pr.second; ++p) std::cout << " " << p->second; std::cout << std::endl; iter = pr.second; } }我们在代码中使用一些类型别名将类型及其表示的事物关联了起来。pets 容器保存的是 pair<string,string> 类型的对象,这个 pair 对象以 pet 类型作为键,以 pet 的名称为对象。
Enter the type of your pet and its name: rabbit Flopsy
Do you want to enter another(Y or N)? y
Enter the type of your pet and its name: rabbit Mopsy
Do you want to enter another(Y or N)? y
Enter the type of your pet and its name: rabbit Cottontail
Do you want to enter another(Y or N)? y
Enter the type of your pet and its name: dog Rover
Do you want to enter another(Y or N)? y
Enter the type of your pet and its name: dog Spot
Do you want to enter another(Y or N)? y
Enter the type of your pet and its name: snake Slither
Do you want to enter another(Y or N)? y
Enter the type of your pet and its name: snake Sammy
Do you want to enter another(Y or N)? n
Pet list by type:
Pets of type dog are:
Spot Rover
Pets of type rabbit are:
Cottontail Mopsy Flopsy
Pets of type snake are:
Sammy Slither
本文链接:http://task.lmcjl.com/news/14024.html