[英]Iterating through a vector of pointers
我正在尝试遍历玩家手中的牌。
#include <vector>
#include <iostream>
class Card {
int card_colour, card_type;
public:
std::string display_card();
};
std::string Card::display_card(){
std::stringstream s_card_details;
s_card_details << "Colour: " << card_colour << "\n";
s_card_details << "Type: " << card_type << "\n";
return s_card_details.str();
}
int main()
{
std::vector<Card*>current_cards;
vector<Card*>::iterator iter;
for(iter = current_cards.begin(); iter != current_cards.end(); iter++)
{
std::cout << iter->display_card() << std::endl;
}
}
这条线
std::cout << iter->display_card() << std::endl;
目前提出了
错误:表达式必须具有指向类的指针类型。
我怎样才能解决这个问题?
尝试这个:
cout << (*iter)->display_card() << endl;
*
运算符为您提供迭代器引用的项,在您的情况下是一个指针。 然后使用->
取消引用该指针。
您必须取消引用迭代器才能访问指针:
#include <vector>
#include <iostream>
class Card {
public:
std::string display_card();
};
int main() {
std::vector<Card*>current_cards;
std::vector<Card*>::iterator iter, end;
for(iter = current_cards.begin(), end = current_cards.end() ; iter != end; ++iter) {
std::cout << (*iter)->display_card() << std::endl;
}
}
另一个观察是iter++
,你应该避免利用++iter
(参见https://stackoverflow.com/a/24904/2077394 )。 根据容器的不同,您可能还希望避免每次迭代调用end()。
(顺便说一句,它总是有助于提供一个可重复的最小例子,就像我刚问你问的那样。)
通过iter->取消引用迭代器给出一个指向Card类型对象的指针,你必须写(* iter) - > display_card();
使用(*iter)->
的替代方法是使用基于范围的 for预先取消引用迭代器。
std::vector<Card*> current_cards;
// Code that populates current_cards goes here...
for(auto p_card : current_cards)
{
std::cout << p_card->display_card() << std::endl;
}
在上面的代码中, p_card
已经是一个Card*
指针,而不是一个std::vector<Card*>::iterator
迭代器。 对我来说,这比显式取消引用迭代器然后取消引用指针的版本更清晰,当然也更简洁。 这也意味着我不必担心->
和一元*
的运算符优先级陷阱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.