Добавление строки в массив неизвестного размера c ++ - PullRequest
1 голос
/ 28 февраля 2012

У меня проблемы с массивом в C ++. Смотрите, я хочу позволить пользователю дать программе ввод в виде String и продолжать делать это, пока пользователь не будет удовлетворен. Мой ввод работает нормально, но когда я хочу сохранить строки в массиве, я работаю с некоторыми проблемами. Я должен определить размер для моего массива, по-видимому? и есть ли способ сохранить входные данные в 2 или 3 различных arrays (в зависимости от входных данных, которые я сортирую с помощью некоторых операторов if) строк и распечатать их? Мой код выглядит примерно так сейчас ...

string firstarray[10];
string secarray[10];

//The cin stuff here and reading strings from user-input

    if(MyCondition1){ 
for(int x = 0; x<=9;x++){ 
firstarray[x] = name;  
}

  if(MyCondition2){ 
    for(int x = 0; x<=9;x++){ 
    secarray[x] = name;  
    }

Есть ли способ пропустить 10-предел массива? это может быть как строка

firstarray[];

Ответы [ 2 ]

8 голосов
/ 28 февраля 2012

Вы ищете std :: list .Или, что лучше, std :: vector , который позволяет получить доступ к элементам по их положению.

Оба они могут быть динамически развернуты.

using namespace std;

// looks like this:
vector<string> firstvector;

firstvector.push_back(somestring); // appends somestring to the end of the vector

cout << firstvector[someindex]; // gets the string at position someindex
cout << firstvector.back(); // gets the last element

По поводу вашего второго вопроса:
Конечно, вы можете создать несколько массивов / векторов для вставки ваших строк. Может быть, даже использовать std :: map типа map<key, vector<string>> где key может быть перечислением для категории (или строкой, , но перечисление лучше ).

Вы вводите новое значение в один из векторов:

tCategoryEnum category = eCategoryNone;
switch(condition)
{
  case MyCondition1:
    category = eCategory1;
    break;
  case MyCondition2:
    category = eCategory2;
    break;
  // ...
}
// check if a category was found:
if(category != eCategoryNone)
{
    categoryMap[category].push_back(name);
}

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

for(int i = 0; i < categoryMap.size(); i++)
  for(int j = 0; j < categoryMap[i].size(); j++)
    cout << categoryMap[i][j];
5 голосов
/ 28 февраля 2012

Рассматривали ли вы использовать std::vector<string> >?

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