Вам на самом деле не нужен multi_index_container для этого.Вы можете сделать это:
inline bool operator<(const indexItems& l, const indexItems& r) {
return std::tie(l.x, l.y, l.z) < std::tie(r.x, r.y, r.z);
}
inline bool operator==(const indexItems& l, const indexItems& r) {
return std::tie(l.x, l.y, l.z) == std::tie(r.x, r.y, r.z);
}
std::set<indexItems> items; // or use map with any second type
Теперь у вас есть набор данных, упорядоченный сначала по x, затем по y, затем по z.Для запроса x=1 AND y="a" AND z="s"
:
items.find(indexItems{1, "a", "s"});
Чтобы перебрать все значения, отсортированные по x (вторично отсортированные по y и z, хотя это на самом деле не требуется, это тоже не повредит):
for (const indexItems& item : items)
// ...
В качестве бонуса, если вы хотите найти все значения в некотором диапазоне x
:
auto it = items.lower_bound(indexItems{100});
auto end = items.upper_bound(indexItems{105});
for (; it != end; ++it)
// ...