Как инициализировать std :: массив строк? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть std::array<std::string, 4>, который я хочу использовать для хранения имен путей для текстовых файлов, которые я хочу прочитать в программе. До сих пор я объявляю массив, а затем присваиваю каждому std::string объекту значение.

#include <array>
#include <string>
using std::array;
using std::string;
...
array<string, 4> path_names;
path_names.at(0) = "../data/book.txt";
path_names.at(0) = "../data/film.txt";
path_names.at(0) = "../data/video.txt";
path_names.at(0) = "../data/periodic.txt";

Я использую этот подход, потому что заранее знаю, что в массиве ровно 4 элемента, размер массива не изменится, а каждое имя пути жестко закодировано и также не может измениться.

Я хочу объявить и инициализировать массив и все его элементы всего за один шаг. Например, вот как я могу объявить инициализировать массив int s:

array<int, 10> ia2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};  // list initialization

Как бы я поступил так же, кроме std::string? Создание этих строк будет включать вызов конструктора. Это не так просто, как просто инициализация списка int с. Как это сделать?

1 Ответ

0 голосов
/ 17 сентября 2018

Это можно сделать двумя способами:

  1. Использование строковых литералов в инициализации списка

array<string, 4> path_names = {"../data/book.txt", "../data/film.txt", "../data/video.txt", "../data/periodic.txt"};

Назначение имён путей к строкам и их использование при инициализации.

string s1 = "../data/book.txt";
string s2 = "../data/film.txt";
string s3 = "../data/video.txt";
string s4 = "../data/periodic.txt";
array<string, 4> path_names = {s1, s2, s3, s4};

А если вы хотите избежать копирования здесь, вы можете использовать std::move:

array<string, 4> path_names = {std::move(s1), std::move(s2), std::move(s3), std::move(s4)};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...