1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <unordered_map> 11 12// template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 13// class Alloc = allocator<pair<const Key, T>>> 14// class unordered_multimap 15 16// iterator erase(const_iterator first, const_iterator last) 17 18#include <unordered_map> 19#include <string> 20#include <cassert> 21#include <cstddef> 22 23#include "min_allocator.h" 24 25int main() 26{ 27 { 28 typedef std::unordered_multimap<int, std::string> C; 29 typedef std::pair<int, std::string> P; 30 P a[] = 31 { 32 P(1, "one"), 33 P(2, "two"), 34 P(3, "three"), 35 P(4, "four"), 36 P(1, "four"), 37 P(2, "four"), 38 }; 39 C c(a, a + sizeof(a)/sizeof(a[0])); 40 C::const_iterator i = c.find(2); 41 C::const_iterator j = next(i, 2); 42 C::iterator k = c.erase(i, i); 43 assert(k == i); 44 assert(c.size() == 6); 45 typedef std::pair<C::iterator, C::iterator> Eq; 46 Eq eq = c.equal_range(1); 47 assert(std::distance(eq.first, eq.second) == 2); 48 k = eq.first; 49 assert(k->first == 1); 50 assert(k->second == "one"); 51 ++k; 52 assert(k->first == 1); 53 assert(k->second == "four"); 54 eq = c.equal_range(2); 55 assert(std::distance(eq.first, eq.second) == 2); 56 k = eq.first; 57 assert(k->first == 2); 58 assert(k->second == "two"); 59 ++k; 60 assert(k->first == 2); 61 assert(k->second == "four"); 62 eq = c.equal_range(3); 63 assert(std::distance(eq.first, eq.second) == 1); 64 k = eq.first; 65 assert(k->first == 3); 66 assert(k->second == "three"); 67 eq = c.equal_range(4); 68 assert(std::distance(eq.first, eq.second) == 1); 69 k = eq.first; 70 assert(k->first == 4); 71 assert(k->second == "four"); 72 assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size()); 73 assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size()); 74 75 k = c.erase(i, j); 76 assert(c.size() == 4); 77 eq = c.equal_range(1); 78 assert(std::distance(eq.first, eq.second) == 2); 79 k = eq.first; 80 assert(k->first == 1); 81 assert(k->second == "one"); 82 ++k; 83 assert(k->first == 1); 84 assert(k->second == "four"); 85 eq = c.equal_range(3); 86 assert(std::distance(eq.first, eq.second) == 1); 87 k = eq.first; 88 assert(k->first == 3); 89 assert(k->second == "three"); 90 eq = c.equal_range(4); 91 assert(std::distance(eq.first, eq.second) == 1); 92 k = eq.first; 93 assert(k->first == 4); 94 assert(k->second == "four"); 95 assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size()); 96 assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size()); 97 98 k = c.erase(c.cbegin(), c.cend()); 99 assert(c.size() == 0); 100 assert(k == c.end()); 101 } 102#if TEST_STD_VER >= 11 103 { 104 typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>, 105 min_allocator<std::pair<const int, std::string>>> C; 106 typedef std::pair<int, std::string> P; 107 P a[] = 108 { 109 P(1, "one"), 110 P(2, "two"), 111 P(3, "three"), 112 P(4, "four"), 113 P(1, "four"), 114 P(2, "four"), 115 }; 116 C c(a, a + sizeof(a)/sizeof(a[0])); 117 C::const_iterator i = c.find(2); 118 C::const_iterator j = next(i, 2); 119 C::iterator k = c.erase(i, i); 120 assert(k == i); 121 assert(c.size() == 6); 122 typedef std::pair<C::iterator, C::iterator> Eq; 123 Eq eq = c.equal_range(1); 124 assert(std::distance(eq.first, eq.second) == 2); 125 k = eq.first; 126 assert(k->first == 1); 127 assert(k->second == "one"); 128 ++k; 129 assert(k->first == 1); 130 assert(k->second == "four"); 131 eq = c.equal_range(2); 132 assert(std::distance(eq.first, eq.second) == 2); 133 k = eq.first; 134 assert(k->first == 2); 135 assert(k->second == "two"); 136 ++k; 137 assert(k->first == 2); 138 assert(k->second == "four"); 139 eq = c.equal_range(3); 140 assert(std::distance(eq.first, eq.second) == 1); 141 k = eq.first; 142 assert(k->first == 3); 143 assert(k->second == "three"); 144 eq = c.equal_range(4); 145 assert(std::distance(eq.first, eq.second) == 1); 146 k = eq.first; 147 assert(k->first == 4); 148 assert(k->second == "four"); 149 assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size()); 150 assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size()); 151 152 k = c.erase(i, j); 153 assert(c.size() == 4); 154 eq = c.equal_range(1); 155 assert(std::distance(eq.first, eq.second) == 2); 156 k = eq.first; 157 assert(k->first == 1); 158 assert(k->second == "one"); 159 ++k; 160 assert(k->first == 1); 161 assert(k->second == "four"); 162 eq = c.equal_range(3); 163 assert(std::distance(eq.first, eq.second) == 1); 164 k = eq.first; 165 assert(k->first == 3); 166 assert(k->second == "three"); 167 eq = c.equal_range(4); 168 assert(std::distance(eq.first, eq.second) == 1); 169 k = eq.first; 170 assert(k->first == 4); 171 assert(k->second == "four"); 172 assert(static_cast<std::size_t>(std::distance(c.begin(), c.end())) == c.size()); 173 assert(static_cast<std::size_t>(std::distance(c.cbegin(), c.cend())) == c.size()); 174 175 k = c.erase(c.cbegin(), c.cend()); 176 assert(c.size() == 0); 177 assert(k == c.end()); 178 } 179#endif 180} 181