通过指针向量进行迭代

Iterating through a vector of pointers

本文关键字:迭代 向量 指针      更新时间:2023-10-16

我正在尝试迭代玩家的一手牌。

#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迭代器。对我来说,这比显式取消引用迭代器然后取消引用指针的版本更清楚,当然也更简洁。这也意味着我不必担心->和一元*的运算符优先级陷阱。