Вектор <string>** p = новый вектор <string>* [10]; есть ли смысл в C ++? - PullRequest
0 голосов
/ 31 марта 2020

Я натолкнулся на фрагмент кода.

Это упражнение на C ++, чтобы судить , правильное или неправильное определение.

vector<string>** p = new vector<string> * [10];

Я так думаю неверно, потому что lvalue объявляет p как указатель на указатель на вектор строки.

rvalue - массив из десяти указателей на вектор строки.

Но код успешно компилируется без предупреждения.

Имеет ли это определение какой-либо смысл?

1 Ответ

2 голосов
/ 31 марта 2020

Декларация является законной и корректной.

new T[...] возвращает указатель T*, где T в данном случае vector<string>*. Таким образом, new vector<string>*[...] возвращает vector<string>**, то есть то, что p объявлено как.

Однако этот вид кодирования также довольно бесполезен в современном коде, поэтому нет, он "не имеет смысла" ». Вместо этого он должен выглядеть примерно так:

vector<vector<string>*> p(10);

Или, более вероятно (при условии, что отдельные vector s будут выделены с new):

vector<std::unique_ptr<vector<string>>> p(10);

Но на самом деле все должно быть просто так:

vector<vector<string>> p(10);

И затем, поскольку используется фиксированная длина, внешняя vector следует изменить на std::array вместо этого:

array<vector<string>, 10> p;

ОЧЕНЬ РЕДКО имеет ли смысл динамически выделять стандартный C ++ контейнеры.

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