Раскрытие информации: Я пытаюсь решить проблему со строгими ограничениями времени и памяти. Обычно я использую векторы и строки, но здесь мне нужно самое быстрое и наименьшее решение (с векторами, которые на самом деле выполнялись над пределом времени), поэтому я обратился к динамическим массивам char *. Соответствующие части моего кода:Удаление динамического символа ** в C++
char** substrings(string s, int* n){
*n = 0;
...
////////////////////////////////
char** strings = new char*[*n];
////////////////////////////////
for (int i = 0; i < s.length(); i++){
for (int j = 1; j < s.length() - i + 1; j++){
...
strings[si] = tmp;
...
}
}
return strings;
}
int main(){
...
for (int ti = 0; ti < t; ti++){
cin >> s;
char** substr = substrings(s, &n);
...
for (int i = 0; i < n; i++){
delete substr[i];
}
}
return 0;
}
Все работает просто отлично без удаления массива (массивов), но это неприемлемо, так как я иду по этому поводу? Я пробовал много вариантов, которые казались логичными, но я получаю ошибки времени выполнения.
Я считаю, что низкая производительность связана с вашим алгоритмом, а не с использованием 'std :: string' или' std :: vector'. – 101010
вы не можете сделать это быстрее, чем вектор, потому что вектор использует ту же «новую», просто предопределяющую векторную память, указав количество элементов. –
Фактически использование символов вместо строк помогло мне приблизиться к сроку с несколькими сотыми долями секунды. Проблема с векторами, я думаю, заключалась в том, что тестовые примеры добавляли элементы много тысяч раз, и перераспределение занимало слишком много времени. Я хотел сэкономить время, выделив память только один раз, и именно поэтому я использовал массив. – b4kancs