Как инициализировать вектор объектов с использованием как вектора, так и конструктора объектов?

How do I initialize std::vector from an existing std::vector which are the names of the files that are intended to open?

Без инициализации vector , я могу сделать это, используя

std::vector input_file_names;
// Populate the vector with names of files that needs to open.
// ...
std::vector input_files_;
for (auto const & input_file_name : input_file_names) {
  input_files_.emplace_back(input_file_name);
}
4
nl ja de
Поскольку std :: ifstream isn ' t даже с возможностью копирования, мне любопытно, как ваш вектор собирается в первую очередь. Конструкция move конструктивна, но это может не сработать, как вы надеетесь.
добавлено автор WhozCraig, источник
Что не так с вашим существующим решением? Я не думаю, что вы можете сделать это, используя конструктор, если не знаете во время компиляции, сколько у вас имен.
добавлено автор Kevin Ballard, источник
@WiSaGaN: Ну, как я уже сказал, я не думаю, что это возможно, если вы не знаете во время компиляции, сколько там элементов. Поэтому я думаю, вам нужно придерживаться тела конструктора. Единственный вариант - включить это в функцию std :: vector (*) (std :: vector ) и вызвать это в вашем инициализаторе, но это ничего не спасет.
добавлено автор Kevin Ballard, источник
@WiSaGaN: Того же типа, конечно. Я не знал, что std :: ifstream имеет конструктор, который взял std :: string и открыл файл, поэтому я не понял, что решение sheu будет работать.
добавлено автор Kevin Ballard, источник
@KevinBallard Мне нужно поместить их в пользовательский класс, и удобнее иметь их в инициализаторе конструктора классов вместо тела конструктора.
добавлено автор WiSaGaN, источник
@KevinBallard Почему это имеет какое-либо отношение к времени компиляции? Разве вектор не может быть инициализирован из другого вектора случайного числа элементов того же типа? std :: vector words2 (words1.begin (), words1.end ());
добавлено автор WiSaGaN, источник
@KevinBallard Я тоже не знал. Сразу после комментария выше, она отправила ответ.
добавлено автор WiSaGaN, источник

1 ответы

В c ++ 11 конструктор std :: ifstream принимает параметр std :: string в качестве параметра. Строка, которая вместе с конструктором копии std :: vector , и это должно работать:

std::vector filenames;
std::vector files(filenames.begin(), filenames.end());
14
добавлено
@ArneMertz, Кажется, они на самом деле не отмечены explicit . Я думал, что они будут такими же.
добавлено автор chris, источник
@ArneMertz, Интересно, cppreference оставили эту деталь.
добавлено автор chris, источник
1 Если он принимает параметр, он не является конструктором по умолчанию. 2 Конструкторы ifstream , содержащие имена файлов (либо как string , либо как char * ), являются явными, так что вы можете 't конвертировать имена файлов неявно в ifstream s.
добавлено автор Arne Mertz, источник
@sheu, chris: преобразование из std :: string в std :: ifstream также будет неявным преобразованием, а конструктор действительно является помечен как явный ( §27.9.1.7,3 ). Однако конструктор диапазона vector явно вызывает преобразование, поэтому я ошибался: §23.2.3 указывает, что в этом случае ifstream должен be EmplaceConstructible из string , который находится от §23.2.1,13 , так как используется std :: allocator в целевом векторе.
добавлено автор Arne Mertz, источник
Да, слева . Меня это тоже озадачило, поэтому я просто посмотрел в стандарте и исправил его;)
добавлено автор Arne Mertz, источник
Конструктор экземпляров диапазона FTW. Просто не забудьте скомпилировать в режиме c ++ 11 :-)
добавлено автор sheu, источник
@ArneMertz: хорошо, я урезал бит «по умолчанию» для вас. Что касается второго бита: начиная с c ++ 0x, std :: ifstream имеет имеет конструктор, который принимает параметр std :: string ; не требуется неявное преобразование.
добавлено автор sheu, источник
Я думал, что это не сработает. Но, похоже, я ошибся ...
добавлено автор WiSaGaN, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest