Как вырастить динамический массив указателей на символы (в C ++)? - PullRequest
0 голосов
/ 17 февраля 2010

Я пытаюсь работать с массивом указателей на символы.
Допустим, я динамически объявляю такой массив следующим образом:

int numrows=100;  
char** array = new char*[numrows];  

А затем я заполняю его с помощью getline, чтобы получить строки изфайл, преобразовывающий строки в массивы char, затем устанавливающий указатель в моем массиве так, чтобы он указывал на указанный массив char следующим образом:

string entry;  
int i=0;
while (getline(file,entry)){  
  char* cstring = new char[entry.length()];  
  array[i]=strncpy(cstring,entry.c_str(),entry.length());  
  free(cstring);  
  i++;  
}

(это работает, но есть ли лучший способ сделать это?)
Проблема в том, что я не знаю, как вырастить массив, когда я стану больше, чем числа.Я знаю, как сделать это для одномерного массива, но двумерность отталкивает меня.

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

if (i==numrows){  
  char** temp = new char*[numrows+numrows];  
  for (int j=0;j<i;j++){  
    char* cstring = new char[strlen(array[i])];  
    temp[i]=strncpy(cstrin,array[i],strlen(array[i]));  
    free(cstring);
  }
  delete [] array;
  array = temp;
}

Так что, если текущий массив заполнится, сделайте секундумассив, который в два раза больше текущего массива и заполнить его содержимым текущего массива.Затем удалите массив и дайте массиву указывать на темп.Я в порядке до создания нового массива.Я могу получить содержимое массива в temp, но когда я удаляю массив и устанавливаю array = temp, содержимое массива не является содержимым temp.

Так что мой вопрос в том, как я могу / должен расти этот динамический массив указателей на символы?

Ответы [ 3 ]

7 голосов
/ 17 февраля 2010

используйте std :: vector - это ваш друг

 std::vector<std::string> arr;
 while(getline(file, entry))
   {
       arr.push_back(entry);
  }

сделано

сортировка может быть выполнена с использованием векторной сортировки с пользовательским сравнением

 bool less3(const std::string &s1, const std::string &s2)
 {
      return s1.compare(0, 3, s2, 0, 3) == 0;
 }

 std::sort(arr.begin(), arr.end(), less3);

Могу поспорить, что less3 можно сделать более эффективным, но удобочитаемость выиграет, если вы действительно не пострадаете

исправлено исправление согласно хорошему комментарию от gman

0 голосов
/ 17 февраля 2010

теперь я вижу, вы говорите, что это класс, который позволяет вам использовать STL. Класс преподавания с ++, который запрещает одну из основных функций языка! - все равно проезжая по

Вам не нужно копировать строки, чтобы изменить размер массива, вам просто нужно скопировать указатели.

 if (i==numrows){  
   char** temp = new char*[numrows+numrows];  
   for (int j=0;j<i;j++){  
     temp[j]=array[j];
    }
    delete [] array;
    array = temp;
 }

я уверен, что есть еще те, которые остались - как домашнее задание

0 голосов
/ 17 февраля 2010

Помимо замечаний Тайлера МакГенри и того факта, что вам следует использовать STL, проблема, скорее всего, заключается в том, что вы освобождаете каждую cstring после ее копирования. Возможно, вы намеревались освободить оригинальную строку вместо этого?

  for (int j=0;j<i;j++){  
    char* cstring = new char[strlen(array[i])];  
    temp[i]=strncpy(cstring,array[i],strlen(array[i]));  
    delete[] array[i];
  }

Когда вы впервые заполняете массив, НЕ вызывайте free () для строки. Прежде всего, вы должны использовать delete [], но, что более важно, вы все еще хотите получить доступ к этой строке позже, верно?

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