Использование указателей для доступа к строкам данных внутри карты в C++

У меня есть следующая структура данных, которая хранит результат из базы данных,

//       column name,    array of (row values)
std::map<std::string, std::vector<std::string>> dataset;

Это будет иметь вектор значений строковых значений для каждого столбца, и я могу быстро получить доступ к каждому значению столбца с помощью

dataset["columnName"][rowIndex];

Иногда, я также хочу получить доступ ко всем столбцам полной строки, это потребует сложного кода, как,

std::vector<std::string> getRow(unsigned int rowIndex)
{
    std::vector<std::string> row_data;
    for(auto& col : dataset)
        row_data.emplace(col[0]);
    return row_data;
}

Достаточно ли эффективна эта реализация для доступа к данным строк? Можно ли сохранить другую карту в ориентации по строкам с указателем на значения в наборе данных? Как это сделать?

Что-то вроде,

         row Index,     array of (  pointer  to  string value in dataset)
std::map<unsigned long, std::vector<std::unique_ptr<std::string>>> point;

1 ответ

  1. Если вам всегда нужна полная строка, я не знаю, как сделать ее более эффективной, однако, когда вам также нужны только некоторые записи в данной строке, я бы использовал что-то вроде этого:

    #include <map>
    #include <string>
    #include <vector>
    
    typedef std::map<std::string, std::vector<std::string> > MAP;
    
    class MapRow{
        public:
            MapRow(MAP* map, unsigned int row) : map(map),row(row){}
    
            std::string& operator[](std::string col){
                return (*map)[col][row];
            }
            const std::string& operator[](std::string col) const {
                return (*map)[col][row];
            }   
        private:
            MAP* map;
            unsigned int row;
    };