2008-11-26 2 views
11

Я думаю, что я объявил вектор с объектом правильно. Но я не знаю, как получить доступ к его членам при циклировании с помощью Iterator.C++ STL Векторный Итератор, получающий доступ к объектам объекта

В моем коде строка --- >> cout < < "" < < * Iter;

Как распечатать содержимое элементов? Как * Iter.m_PackLine ???

Не уверен, что я использовал правильную терминологию, но ценю помощь! Благодаря

class CFileInfo 
{ 
    public: 
     std::string m_PackLine; 
     std::string m_FileDateTime; 
     int m_NumDownloads; 
}; 

void main() 
{ 
    CFileInfo packInfo; 

    vector<CFileInfo, CFileInfo&> unsortedFiles; 
    vector<CFileInfo, CFileInfo&>::iterator Iter; 

    packInfo.m_PackLine = "Sample Line 1"; 
    packInfo.m_FileDateTime = "06/22/2008 04:34"; 
    packInfo.m_NumDownloads = 0; 
    unsortedFiles.push_back(packInfo); 

    packInfo.m_PackLine = "Sample Line 2"; 
    packInfo.m_FileDateTime = "12/05/2007 14:54"; 
    packInfo.m_NumDownloads = 1; 
    unsortedFiles.push_back(packInfo); 

for (Iter = unsortedFiles.begin(); Iter != unsortedFiles.end(); Iter++) 
{ 
    cout << " " << *Iter; // !!! THIS IS WHERE I GET STUMPED 
    // How do I output values of the object members? 
} 
} // end main 
+0

Богатый - при отправке вопросов, пожалуйста, используйте кнопку «Код», чтобы отформатировать исходный код. Форматирование кода будет поддерживать отступы и делать подсветку синтаксиса. Тогда вы получите более быстрый ответ. – 2008-11-26 21:02:01

ответ

16
cout << " " << *Iter; 

будет работать только если CFileInfo имеет перегруженный operator<<, который может выводить вашу структуру. Вы можете вывести отдельные члены структуры вместо того, чтобы, как это:

cout << " " << Iter->m_PackLine; 

В качестве альтернативы, следующее эквивалентно:

cout << " " << (*Iter).m_PackLine; 

Вы должны поставить скобки вокруг * Iter, так как оператор-член доступа в противном случае связывается с ним.

На боковом узле сделайте свою основную функцию возвратом int вместо void. в результате чего его возврат недействителен в C++.


Вы объявляете вектор, как это:

vector<CFileInfo, CFileInfo&> unsortedFiles; 

Второй аргумент vector должно быть другое дело. Для вашего кода не требуется, чтобы вектор был вторым аргументом. Просто используйте это:

vector<CFileInfo> unsortedFiles; 

Другого дело, я заметил, вы увеличиваете итератор с помощью Iter++ (так называемого postfix increment). Для итераторов всегда предпочитайте ++Iter, который называется prefix increment.

+0

Второй параметр шаблона вектора - это Allocator. Он используется для запроса памяти, когда вектор растет. – 2008-11-26 21:24:38

1

Это первая проблема, которую я заметил:

std::vector шаблон.

У вас есть:

vector unsortedFiles; 

вам нужно что-то вроде:

vector<CFileInfo> unsortedFiles; 

Теперь, когда я думаю об этом, ваше определение шаблона может быть только что проанализирован путем StackOverflow комментария системы.

+0

Да, он разобрался, хе-хе :) – richyz 2008-11-26 21:04:27

3

Используйте (* iter) .member или iter-> member.

Вы также можете использовать: временные конструкции

CFileInfo &fileInfo = *iter; 
cout << " " << fileInfo.myMember; 

Кроме того, для того, что вы делаете, вы, вероятно, хотите const_iterator вместо с (изменяемый) итератора.

Кроме того, std :: vector - это шаблон, принимающий имя и распределитель, а не два типа. Вы можете использовать аллокатор по умолчанию пути удаления второго аргумента шаблона:

vector<CFileInfo> unsortedFiles; 
vector<CFileInfo>::iterator Iter; 

Некоторых придирки:

  • магистраль должен вернуть Int.
  • Возможно, было бы лучше объявить переменную итератора в инструкции for.
  • Вероятно, быстрее во время выполнения использовать оператор prefix ++ (++ iter) вместо оператора postfix (iter ++) в вашем цикле for.
  • Нет необходимости в комментариях к основному() окончанию.
1

Первый правильный you'r вектор декларации:

vector<CFileInfo > unsortedFiles; 

Далее вам нужно определить оператор вывода для класса:

std::ostream& operator<<(std::ostream& str,CFileInfo const& data) 
{ 
     // Do something here 
     /* Potentailly you could do this 
     * But this requires that this function be a friend of the class 

     str << data.m_PackLine << ":" 
      << data.m_FileDateTime << ":" 
      << data.m_NumDownloads << ":"; 

     * Or you could do this 

      data.print(str); // Make print a public const method. 

     */ 

     return str; 
} 

Обычно либо сделать вывод оператора другом ваш класс или предоставить общедоступный метод печати, который принимает поток. В любом случае вы можете получить доступ к элементам и передать их вручную на выход.

После выхода итератора определяется вы можете изменить свой цикл, чтобы использовать стандартные версии библиотеки:

std::for_each(unsortedFiles.begin() 
       unsortedFiles.end() 
       std::ostream_iterator<CFileInfo>(std::cout," ") 
      ); 
-1

Спасибо всем, хотел бы предоставить несколько баллов за ответы :)

LITB также указал на проблему у меня был в моей декларации вектора. Я удалил второй аргумент в объявлении вектора, и он сработал.

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

0

vector<CFileInfo, CFileInfo&> не работает вообще. Второй параметр для вектора - это распределитель, который использует вектор, а CFileInfo не отвечает этим требованиям и не имеет никакого ссылочного типа. Я думаю, вы просто хотите vector<CFileInfo>, итераторы и участники автоматически вернут CFileInfo&.

Смежные вопросы