通过指针向量进行迭代
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)->
的另一种选择是使用基于范围的来预先取消引用迭代器。
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
迭代器。对我来说,这比显式取消引用迭代器然后取消引用指针的版本更清楚,当然也更简洁。这也意味着我不必担心->
和一元*
的运算符优先级陷阱。
相关文章:
- C++11 迭代向量的新方法?
- 迭代向量以获得搜索功能
- 为什么迭代向量在 c++ 中给出固定地址?
- 如何从向量映射中迭代向量
- 我怎样才能在不重复的情况下随机迭代向量的每个元素
- 是否有用于迭代向量的函数,而不管其类型如何?
- 您可以在一段时间内迭代向量
- 迭代向量向量中的第 i 行
- 指针的迭代向量会导致分段错误
- 使用一个迭代器迭代向量的向量
- 迭代向量时跳过行
- 迭代向量以更新word_counter
- 迭代向量中属性具有特定值的元素范围
- 在C++中迭代向量
- 在迭代向量的 for 循环中无效使用非静态数据成员
- 在C++中迭代向量
- 迭代向量时陷入无限循环的问题
- 迭代向量字符串的字符(C++禁止指针和整数之间的比较)
- 在 c++11 中,迭代向量的最现代、最"right"的方法是什么
- 5秒内迭代向量5