как коректно создать двумерный динамический массив строк и очистить память в с++
пробовал этот вариант:
string** strings = new (string*);
//формируем массив
for (int i = 0; i < 5; i++)
*(strings + i) = new string;
//заполнаем массив
for (int i = 0; i < 5; i++)
getline(cin, **(strings + i));
cout << endl << endl;
cout << "strings:" << endl;
for (int i = 0; i < 5; i++)
cout << i << '.' << **(strings + i) << endl;
for (int i = 0; i < 5; i++)
delete *(strings + i);
delete strings;
выдает ошибку. В чем моя ошибка? Как ее исправить? Что лучше использовать?
Ответы (2 шт):
Автор решения: n1tr0xs
→ Ссылка
// создание
int size_1 = 2, size_2 = 2;
string **arr = new string*[size_1];
for(int i=0; i<size_2; ++i)
arr[i] = new string[size_2];
// заполнение
for(int i=0; i<size_1; ++i)
for(int j=0; j<size_2; ++j)
getline(cin, arr[i][j]);
// вывод
for(int i=0; i<size_1; ++i)
for(int j=0; j<size_2; ++j)
cout << arr[i][j] << '\n';
//очистка памяти
for(int i=0; i<size_2; ++i)
delete[] arr[i];
delete[] arr;
Но обычно блоки "создание" и "заполнение" сливают в один:
// создание и заполнение
int size_1 = 2, size_2 = 2;
string **arr = new string*[size_1];
for(int i=0; i<size_2; ++i){
arr[i] = new string[size_2];
for(int j=0; j<size_2; ++j)
getline(cin, arr[i][j]);
}
// вывод
for(int i=0; i<size_1; ++i)
for(int j=0; j<size_2; ++j)
cout << arr[i][j] << '\n';
//очистка памяти
for(int i=0; i<size_2; ++i)
delete[] arr[i];
delete[] arr;
Автор решения: Fonar Siny
→ Ссылка
Как-то так?
#include <iostream>
#include <limits>
#include <string>
#include <vector>
int main()
{
std::size_t arrays = 0;
std::size_t idx = 0;
std::string input;
std::cout << "Number of string arrays:" << std::endl;
std::cin >> arrays;
std::vector<std::vector<std::string> > strings( arrays );
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
for( ; idx < strings.size(); ++idx ) {
std::cout << "Input set " << (idx + 1) << ", empty string to end:" << std::endl;
while( 1 ) {
std::getline( std::cin, input );
if( input.empty() ) {
break;
}
strings[idx].emplace_back( std::move( input ) );
}
}
idx = 0;
for( const auto& i : strings ) {
std::cout << "Set " << ++idx << " size: " << i.size() << std::endl;
for( const auto& j : i ) {
std::cout << " " << j << std::endl;
}
}
}