Изготовление набора
Вам необходимо предоставить компаратор при создании набора:
using std::unordered_map;
using std::set;
using std::string;
set<int, Custom> s(Custom(10, 20));
// Or:
auto s = set<int, Custom>(Custom(10, 20));
Это потому, что он должен иметь компаратор, как только вы начнете присваивать элементы набору, и так как ваш компаратор имеет параметры, он должен знать, что это такое
Использование набора на карте
Компаратор должен быть конструируемым по умолчанию, потому что вызов map["key"]
создаст элемент по умолчанию, если он не существует:
class Custom
{
public:
// Add a default constructor
Custom() : x(0), y(0) {}
Custom (int x, int y) : x (x), y (x) {}
bool operator() (int a, int b)
{
return a < x && y < b;
}
private:
int x, y;
};
В этом случае можно предоставить конструктор по умолчанию для конструктора по умолчанию, поскольку мы можем переназначить его:
unordered_map<string, set<int, Custom>> map;
map["some key"] = set<int, Custom>(Custom(10, 20));
Что если у меня нет или не может быть конструктор по умолчанию?
Мы все еще можем использовать unordered_map
, но мы должны использовать map.at("key")
и map.emplace("key", value)
вместо map["key"]
:
unordered_map<string, set<int, Custom>> map;
set<int, Custom> s(Custom(10, 20));
set<int, Custom> s2(Cunstom(30, 40));
s2.insert(1);
s2.insert(2);
s2.insert(3); // put some stuff in the set
map.emplace("Hello", s); //Inserts the set
map.insert({"Hello", s2}); //Inserts the set as a key-value pair
Мы можем получить значения, используя map.at
:
// This line gets the set at "Hello", and inserts 10 into the set:
map.at("Hello").insert(10);
// If "Hello" isn't in the map, there's an error
И мы можем проверить, есть ли что-то на карте, используя map.find("key")
:
// Get an iterator to the key value pair held by "Hello" in the map:
// An iterator acts like a pointer
auto iterator = map.find("Hello");
if(iterator == map.end()) // Check if we found the thing
{
std::cout << "Couldn't find 'Hello' in the map";
}
else
{
// Get the key from the iterator
string key = iterator->first;
// Get a reference to the value from the iterator
set<int, Custom>& value = iterator->second;
}