STL контейнер для стола - PullRequest
1 голос
/ 05 июня 2011

Есть ли какая-либо структура данных для таблицы? как хранить это:

    Width    Height
1     5        10
2     3        20
3     10       2

Мне нужно обратиться к значению по номеру строки и названию, например, (2, «Высота») даст 20.
Я знаю, что могу сделать массив карт или двумерный массив и карту как имя столбца к номеру, но есть ли готовая структура данных для этого?

Ответы [ 5 ]

3 голосов
/ 05 июня 2011

Подойдет массив структур, не так ли?

3 голосов
/ 05 июня 2011

Непосредственно подготовлено, но STL замечательный, и вы всегда можете объединить свой путь:

#include <map>
#include <vector>
#include <string>
#include <iostream>

typedef std::map<std::string, int> col_val_map;
typedef std::vector<col_val_map> table;

int main(){
  table t(3);

  std::string col = "Width";
  t[0][col] = 5;
  t[1][col] = 3;
  t[2][col] = 10;

  col = "Height";
  t[0][col] = 10;
  t[1][col] = 20;
  t[2][col] = 2;

  col = "Random";
  t[0][col] = 42;
  t[1][col] = 1337;
  t[2][col] = 0;

  std::cout << "\t\tWidth\t\tHeigth\t\tRandom\n";
  for(int i=1; i <= 3; ++i){
    std::cout << i << "\t\t" << t[i-1]["Width"]
                   << "\t\t" << t[i-1]["Height"]
                   << "\t\t" << t[i-1]["Random"]
                   << "\n";
  }
}

С выводом, показанным на Ideone .

Или, как говорит @DeadMG, наоборот:

#include <map>
#include <vector>
#include <string>
#include <iostream>

typedef std::vector<int> row_val_array;
typedef std::map<std::string,row_val_array> table;

int main(){
  table t;
  t["Width"].reserve(3);
  t["Width"][0] = 5;
  t["Width"][1] = 3;
  t["Width"][2] = 10;

  t["Height"].reserve(3);
  t["Height"][0] = 10;
  t["Height"][1] = 20;
  t["Height"][2] = 2;

  t["Random"].reserve(3);
  t["Random"][0] = 42;
  t["Random"][1] = 1337;
  t["Random"][2] = 0;      

  std::cout << "\t\tWidth\t\tHeigth\t\tRandom\n";
  for(int i=1; i <= 3; ++i){
    std::cout << i << "\t\t" << t["Width"][i-1]
                   << "\t\t" << t["Height"][i-1]
                   << "\t\t" << t["Random"][i-1]
                   << "\n";
  }
}

Опять же, показано на Ideone .

2 голосов
/ 05 июня 2011

Вы уже смотрели на Boost :: MultiIndex еще?Это почти как представление таблицы базы данных в памяти.Вы можете запросить несколько строк, одну строку и тому подобное.Очень мощный, очень полезный, и я думаю, что он решит вопрос, который вы задаете.

Взято с веб-сайта Boost:

Boost.MultiIndex имеет дополнительные функции, такие как поиск подобъектов., запрос диапазона и обновление на месте элементов, что делает его удобной заменой std :: set и set :: multiset, даже если не требуются возможности многоиндексирования.

В вашем случае,Я бы посмотрел на составной_ключ .

0 голосов
/ 05 июня 2011

Если ваша таблица редкая (почти пустая), то хорошим решением будет единственный std::map, использующий std::pair<int, std::string> в качестве ключа.

Единственным нетривиальным алгоритмом является эффективная итерация по столбцу (но это можно сделать разумно, используя std::map::lower_bound).

0 голосов
/ 05 июня 2011

Боюсь, не в стандартной библиотеке C ++. Конечно, многие люди реализовали нечто подобное - вы можете увидеть мою собственную довольно простую реализацию здесь и здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...