[ACCEPTED]-C++ STL Vector Iterator accessing members of an Object-c++
cout << " " << *Iter;
will only work if CFileInfo
has an overloaded operator<<
that 15 can output your struct. You can output individual 14 members of the struct instead like this:
cout << " " << Iter->m_PackLine;
Alternatively, the 13 following is equivalent to that:
cout << " " << (*Iter).m_PackLine;
You have 12 to put parentheses around *Iter, since the 11 member-access operator binds thighter otherwise.
On 10 a side-node, make your main function return 9 int instead of void. making it return void 8 is not valid in C++.
You declare the vector 7 like this:
vector<CFileInfo, CFileInfo&> unsortedFiles;
The second argument to vector
should 6 be another thing. It's not needed for your 5 code to give the vector a second argument 4 at all. Just use this:
vector<CFileInfo> unsortedFiles;
Another thing i noticed 3 is you increment the iterator using Iter++
(called 2 postfix increment
). For iterators, always prefer ++Iter
, which 1 is called prefix increment
.
Use (*iter).member or iter->member.
You can 7 also use temporaries:
CFileInfo &fileInfo = *iter;
cout << " " << fileInfo.myMember;
Also, for what you're 6 doing, you'd probably want a const_iterator 5 instead of an (mutable) iterator.
In addition, std::vector 4 is a template accepting a typename and an 3 allocator, not two typenames. You can use 2 the default allocator by stripping the second 1 template argument:
vector<CFileInfo> unsortedFiles;
vector<CFileInfo>::iterator Iter;
Some nit-picking:
- main should return an int.
- It'd probably be best to declare your iterator variable in the for statement.
- It'd probably be faster in run-time performance to use the prefix ++ operator (++iter) instead of the postfix operator (iter++) in your for loop.
- No need for your comment about main() ending.
This is the first problem I noticed:
std::vector
is 4 a template.
You have:
vector unsortedFiles;
you need something like:
vector<CFileInfo> unsortedFiles;
Now 3 that I think about it, your template definition 2 may have just gotten parsed out by the stackoverflow 1 comment system.
First correct you'r vector declaration:
vector<CFileInfo > unsortedFiles;
Next 9 you need to define an output operator for 8 your class:
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;
}
Usually you either make the output 7 operator a friend of your class or provide 6 a public print method that takes a stream. Either 5 way you can then access the members and 4 stream them manually to the output.
Once 3 you have the output iterator defined you 2 can change your loop to use the standard 1 library versions:
std::for_each(unsortedFiles.begin()
unsortedFiles.end()
std::ostream_iterator<CFileInfo>(std::cout," ")
);
iter->m_PackLine
or
(*iter).m_PackLine
0
Thanks all, wish I could grant multiple 6 points for the answers :)
litb also pointed 5 out a problem I was having in my declaration 4 of the vector. I removed the second argument 3 in the vector declaration and it worked.
Stackoverflow 2 parsed out some of my code, I'll be more 1 careful in posting next time.
vector<CFileInfo, CFileInfo&
> will not work at all. The second parameter 5 to vector is the allocator the vector uses, and 4 CFileInfo
does not meet those requirements, nor does 3 any reference type. I think you just want 2 vector<CFileInfo>
, the iterators and members will return 1 CFileInfo&
automatically.
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.