繁体   English   中英

遍历指针向量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM