Проблема возникает из упражнений на C++ Primer 5th Edition:Как элегантно инициализировать вектор <char *> со строковым литералом?
Написать программу для назначения элементов из списка полукокса * указатели для символьных строк C-типа на вектор строк.
---------------- Oringinal Вопрос ------------
Сначала я стараюсь следующий несколько прямой путь:
vector<char *> vec = {"Hello", "World"};
vec[0][0] = 'h';
Но компиляции кода я получаю предупреждение:
temp.cpp:11:43: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
vector<char *> vec = {"Hello", "World"};
^
и запуск ./a.out я получаю
Segmentation fault (core dumped)
Я думаю, что это потому, что я пытаюсь написать const char. Поэтому я пытаюсь по-другому:
char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
vec[0][0] = 'h';
На этот раз все в порядке. Но это кажется немного утомительным. Есть ли другой элегантный способ инициализации вектора со строковым литералом?
Вы не можете изменить содержимое строкового литерала. Используйте 'std :: vector' ('std :: string' можно построить из строкового литерала) [live example] (http://coliru.stacked-crooked.com/a/e0a7821f557b64b8) –
Borgleader
Строковые литералы' массив n const char', вы можете найти более подробную информацию [здесь] (http://stackoverflow.com/q/21529194/1708801). Преобразование было нормально в C, но не разрешено в C++, именно из-за проблемы с попыткой изменить их, что является неопределенным поведением. –
@Borgleader Я знаю, что лучше использовать вектор, но упражнение на C++-праймере просит меня преобразовать вектор в вектор . Поэтому мне интересно, как его инициализировать. –
Warbean