C ++ 17
Поскольку вы сказали, что также заинтересованы в решении C ++ 17, вы можете воспользоваться std::string_view
, который не выделяет никакой памяти, а просто содержит указатель на фактические данные и длину строки. Таким образом, операция копирования является легкой.
Конечное решение будет выглядеть следующим образом:
#include <iostream>
#include <string_view>
#include <map>
int main() {
std::map<std::pair<std::string_view, std::string_view>, long> sums = {
{{"1", "2"}, 3},
{{"3", "4"}, 7},
{{"5", "6"}, 11}
};
std::pair<std::string_view, std::string_view> myPair = std::make_pair("1", "2");
auto it = sums.find(myPair);
std::cout << it->second << std::endl; // output: 3
return 0;
}
C ++ 11
Если вы ограничены C ++ 11, тогда вы можете использовать char const*
в качестве std::pair
членов, но тогда вам нужно определить пользовательскую функцию сравнения, например:
#include <iostream>
#include <cstring>
#include <map>
struct cmp_str {
bool operator()(std::pair<char const*, char const*> const& a,
std::pair<char const*, char const*> const& b) const {
return std::strcmp(a.first, b.first) < 0;
}
};
int main() {
std::map<std::pair<char const*, char const*>, long, cmp_str> sums = {
{{"1", "2"}, 3},
{{"3", "4"}, 7},
{{"5", "6"}, 11}
};
std::pair<char const*, char const*> myPair = std::make_pair("1", "2");
auto it = sums.find(myPair);
std::cout << it->second << std::endl;
return 0;
}