Контейнер 2-х видов - PullRequest
       5

Контейнер 2-х видов

2 голосов
/ 08 мая 2011

Существует ли какой-либо контейнер C ++, который может хранить 2 (или более) типа значений, таких как целые и символыЯ хочу сделать игру в блэкджек.Колода должна состоять как из карт, так и из букв.Я не хочу инициализировать его просто числами (так что не говорите об этом!).Я очень начинающий программист, так что не усложняйте.

Ответы [ 6 ]

5 голосов
/ 08 мая 2011

Я предполагаю, что вам нужен контейнер, в котором можно хранить целые числа или символы.

Сначала взгляните на тип данных boost::any в Boost , который может помочь. Затем вы можете создать контейнер из boost::any экземпляров.

Если вы не хотите использовать boost или это кажется излишним, используйте union следующим образом:

typedef struct {
    char type;
    union {
        char character;
        int integer;
    };
} my_struct;

Содержимое полей character и integer в объединении занимает те же слоты памяти. (Ну, integer использует больше слотов, поскольку символы обычно составляют только один байт). Затем вам нужно установить в поле type структуры, скажем, 'c', если вы храните символ, и, скажем, 'i', чтобы сохранить целое число, а затем получить доступ к содержимому структуры, используя character или integer поле в зависимости от значения type.

Наконец, есть также QVariant тип данных Qt, который работает аналогично второму подходу, описанному выше.

3 голосов
/ 08 мая 2011

Также вы можете использовать Boost.Variant

2 голосов
/ 08 мая 2011

Поскольку вы новичок, просто используйте базовые вещи: структуру.

#include <vector>
#include <iostream>

struct MyStruct{
  char cval;
  int ival;
};

int main(){
  using namespace std;

  vector<MyStruct> myvec;
  MyStruct values;

  values.cval = 'S';
  values.ival = 42;
  myvec.push_back(values);

  values.cval = 'A';
  values.ival = 1337;
  myvec.push_back(values);

  values.cval = 'X';
  values.ival = 314159;
  myvec.push_back(values);

  for(int i=0; i < myvec.size(); ++i)
    cout << "myvec[" << i << "], cval: " << myvec[i].cval << ", ival: " << myvec[i].ival << "\n";
}

Вывод:

myvec[0], cval: S, ival: 42  
myvec[1], cval: A, ival: 1337  
myvec[2], cval: X, ival: 314159  

Вы можете увидеть вывод вживую на Ideone.

2 голосов
/ 08 мая 2011

Если вы хотите использовать все значения одновременно, вы можете использовать что-то вроде этого ...

std::pair<int,char> twovals;
std::pair<int,std::pair<char,float> > threevals;
0 голосов
/ 08 мая 2011

Вы можете использовать объекты Boost Tuple. Дополнительная информация: http://www.boost.org/doc/libs/1_46_1/libs/tuple/doc/tuple_users_guide.html#using_library

0 голосов
/ 08 мая 2011

Используйте struct, class или std :: pair для группировки различных типов в составной тип, а затем используйте соответствующий контейнер STL.

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