А насколько он неоднороден и насколько велик по объему данных?
Я обычно пользуюсь векторами
#include <vector>
Например используете типы int и double и какойто another.
std::vector <int> vec_int;
std::vector <double> vec_double;
std::vector <another> vec_another;
А обращаетесь к ним через вектор с "индексами", первый индекс характеризует вектор
определенного типа, второй индекс - порядковый номер элемента в этом векторе.
std::vector <indexclass> vec_index;
А индекскласс включает в себя 2 переменные типа int (индексы для обращения к трем векторам выше).
Или, чтобы не делать indexclass можно 2 вектора паралельных сделать
std::vector <int> vec_index_vec; // какой вектор смотреть
std::vector <int> vec_index_pos; // какуой элемент смотреть в этом векторе
Ну и какойто функцией связываете обращения по индексам к векторам уже непосредственно с данными.
Вообще у Страуструпа в книжке читал по этой теме, а дальше сам долго думал и получилось все что хотел.