Инициализация вектора с помощью потоковых итераторов - PullRequest
0 голосов
/ 29 августа 2009

Я пытаюсь инициализировать вектор с помощью итераторов, и я получаю сообщение об ошибке компилятора, которое в основном говорит о том, что нет соответствующей функции для вызова.

Код считывается из файла с помощью istream_iterator и заканчивается входным стражем. Затем я пытаюсь инициализировать вектор этими двумя итераторами.

#include "std_lib_facilities.h"
#include<iterator>

int main()
{
    string from, to;    // get source and target file names
    cin >> from >> to;

    ifstream is(from.c_str()); // open input stream
    ofstream os(to.c_str());   // open output stream

    istream_iterator<string> ii(is);    // make input iterator for stream
    istream_iterator<string> eos;   // input sentinel
    ostream_iterator<string> oo(os,"\n");

    vector<string> words(ii, eos);  // vector initialized from input
    sort(words.begin(), words.end());   // sort the buffer
    copy(words.begin(), words.end(), oo);  // copy buffer to output
}

Я знаю, что мог бы использовать функцию копирования для копирования входного потока в вектор, но я прочитал, что это можно сделать и таким образом. Может кто-нибудь объяснить, почему это не компилируется? Спасибо.

Ошибка компилятора:

C:\Users\Alex\C++\stream_iterators.cpp|16|error: no matching function for call to `Vector<String>::Vector(std::istream_iterator<String, char, std::char_traits<char>, ptrdiff_t>&, std::istream_iterator<String, char, std::char_traits<char>, ptrdiff_t>&)'|

Редактировать: Это не проблема заголовка. Std_lib_facilities имеет все необходимые заголовки.

Ответы [ 4 ]

1 голос
/ 29 августа 2009
vector<string> words(ii, eos);

является аналогом

vector<string> words;
copy( ii, eos, back_inserter(words) );

vector класс имеет следующий конструктор:

// initialize with range [First, Last)
template<class InputIterator>
   vector(
      InputIterator First,
      InputIterator Last
   );

Для составления примера необходимо указать следующее:

#include <sstream>
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm> // for std::copy

Поскольку ваши идентификаторы не полностью квалифицированы, вы должны добавить следующее:

using namespace std;

Или полностью квалифицировать все идентификаторы STL.

И поменять, наверное,

copy(words.begin(), words.end(), out)

до

copy(words.begin(), words.end(), oo)
0 голосов
/ 29 августа 2009

Класс Vector в std_lib_facilities.h определяет три конструктора, но не тот, который принимает пару итераторов. Вы можете пойти дальше и добавить это в шапку:

template <class Iter>
Vector(Iter from, Iter to): std::vector<T>(from, to) {}

С этим заголовком вы должны принять во внимание, что это для удержания в руках. Оператор [] в реальном std :: vector не должен выполнять проверку диапазона. (Почему бы просто не научить новичков использовать vector :: at вместо этого, пока они не поймут, что, возможно, лучше оставаться в пределах ...?)

0 голосов
/ 29 августа 2009

Заголовок книги имел некоторые проблемы с соответствием, поэтому я просто включил соответствующие заголовки, и это сработало.

0 голосов
/ 29 августа 2009

Пожалуйста, скопируйте и вставьте ошибку компилятора. Также вам не хватает нескольких заголовков, таких как алгоритм и вектор. Вам нужно использовать объявление пространства имен std или использовать std :: для доступа к классам STL.

Как только вы предоставите больше информации, мы сможем дать вам больше советов.

Обновление: почему сообщение об ошибке ссылается на «Вектор» (с заглавной буквы), а не на вектор (строчные буквы)?

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