C ++ изменяемый многотипный массив - PullRequest
1 голос
/ 20 октября 2011

Я довольно новичок в C ++, но знаком с несколькими другими языками.Я хотел бы использовать тип данных, подобный Java ArrayList, Objective-c NSMutableArray или массиву Python, но в C ++.Характеристики, которые я ищу, - это возможность инициализировать массив без емкости (чтобы можно было постепенно добавлять элементы) и возможность хранить несколько типов данных в одном массиве.

Чтобы получить подробную информацию оЯ хочу, чтобы он считывал данные из разных таблиц базы данных mysql, не зная количества полей в таблице, и не мог перемещать эти данные.Мой идеальный тип данных позволит мне хранить что-то вроде этого:

idealArray = [Bool error,[string array],[string array]];

, где строковые массивы могут иметь разные размеры, от 1 до 20 (относительно небольшой).Не знаю, возможно ли это в C ++, любая помощь приветствуется или ссылки на хорошие ресурсы.

Спасибо

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

Стандартный динамически изменяемый массив в C ++ - это std :: vector <>. Однородных контейнеров не существует, если вы не введете косвенность, для этого вы можете использовать boost :: option или boost :: any в зависимости от ваших потребностей.

1 голос
/ 20 октября 2011

Я бы предложил использовать std :: vector из STL. Однако обратите внимание, что в C ++ нет контейнера, который может содержать несколько типов данных. Хотя есть несколько способов симулировать это поведение:

  1. Получите все "типы", которые вы хотите сохранить из определенного "Base_type". Затем сохраните элементы в векторе как std::vector<Base_type*>, но тогда вам нужно будет знать, к какому объекту относится и к какому (динамическому) типу приводиться, если «типы» совершенно разные.
  2. Используйте что-то вроде std::vector<boost::any> из библиотеки наддува (но заметьте, что вы новичок в C ++, это может быть излишним).

На самом деле, вопрос, который вам нужно задать, - почему вы хотите хранить несвязанные «типы» в «массиве» в первую очередь? а если они связаны, то "как"? это поможет вам в определении достойного "Base_type" для "типов".

И, наконец, вкратце, C ++ не имеет однородных массивоподобных структур, которые могут содержать несвязанные типы данных.

1 голос
/ 20 октября 2011

Вы можете использовать структуру или класс для хранения (именованных) нескольких типов данных вместе, например:

class Record
{
   bool _error;
   vector<string> _v1;
   vector<string> _v2;
};
vector<Record> vec;

или std :: tuple для хранения (безымянных) нескольких типов данных, например,

vector<tuple<bool, vector<string>, vector<string> > > vec;
1 голос
/ 20 октября 2011

Вы можете попробовать использовать std::vector<boost::any> (документация здесь ).

...