Прежде всего, отбросьте строку и используйте 2 дюйма, что вы, возможно, уже сделали. Престижность для выяснения, что дерево - лучший способ реализовать разреженную матрицу. Обычно магнит для плохих реализаций кажется.
К вашему сведению, тройной составной ключ тоже работает, и я предполагаю также пару пар.
Это создает некрасивые подпрограммы, поэтому немного магии макросов сделает вашу жизнь проще. Я оставил это одно общее назначение, но приведение типов в макросе - хорошая идея, если вы создаете макросы для конкретных карт. TresKey12
протестирован и работает нормально. QuadKeys
также должно работать.
ПРИМЕЧАНИЕ. Пока ваши ключевые части являются базовыми типами данных, вам не нужно больше ничего писать. AKA, не нужно беспокоиться о функциях сравнения. STL покрыл тебя. Просто закодируйте его и дайте ему разорваться.
using namespace std; // save some typing
#define DosKeys(x,y) std::make_pair(std::make_pair(x,y))
#define TresKeys12(x,y,z) std::make_pair(x,std::make_pair(y,z))
#define TresKeys21(x,y,z) std::make_pair(std::make_pair(x,y),z))
#define QuadKeys(w,x,y,z) std::make_pair(std::make_pair(w,x),std::make_pair(y,z))
map<pair<INT, pair<ULLNG, ULLNG>>, pIC_MESSAGE> MapMe;
MapMe[TresKey12(Part1, Part2, Part3)] = new fooObject;
Если кто-то хочет произвести на меня впечатление, покажите мне, как создать оператор сравнения для TresKeys
, который не зависит от вложенных пар, чтобы я мог использовать один struct
с 3 членами и использовать функцию сравнения.
PS: TresKey12 дал мне проблемы с картой, объявленной как пара, z, так как она делает x, пара, и эти два не играют хорошо. Не проблема для DosKeys или QuadKeys. Если жаркая летняя пятница, вы можете обнаружить неожиданный побочный эффект при наборе текста в DosEquis.
... эээ ... DosKeys пару раз, жажда мексиканского пива. Пусть покупатель будет бдителен. Как говорит Шелдон Купер: «Какая жизнь без прихотей?».