在 C++ 中对自定义对象的向量进行操作 [关闭]
Posted
技术标签:
【中文标题】在 C++ 中对自定义对象的向量进行操作 [关闭]【英文标题】:Operating on vector of custom objects in C++ [closed] 【发布时间】:2018-05-17 03:47:26 【问题描述】:我有一个函数,它使用我的自定义对象 Card 用 52 张卡片填充一个向量。
vector<Card> createDeck()
vector<Card> myDeck;
Card card;
for(int i=0; i < 52; i++)
card.setRank(i);
card.setSuit(i);
myDeck.push_back(card);
return myDeck;
在我的 main 我调用这个 createDeck() 函数并用它来填充另一个向量:
int main()
vector<Card> theDeck;
theDeck = createDeck();
Card someCard;
for(int i = 0; i < 52; i++)
cout << theDeck(i).toString();
我想遍历向量并在每个对象上调用我的 toString 函数(在我的 Card 类中定义)。但是,这段代码给了我以下错误“类型'向量'不提供调用运算符”。
任何帮助将不胜感激。
【问题讨论】:
你想要theDeck[i].toString();
。
【参考方案1】:
问题在于这一行:
cout << theDeck(i).toString();
theDeck
是向量,要访问单个元素,您需要使用下标运算符 i.e theDeck[i].toString()
或更好地使用 .at
函数,因为它也会检查边界,因此您可以使用:
cout << theDeck.at(i).toString();
更新:
基于稻米 cmets 似乎 .at
不适合这个用例,保留绝对是一个好主意。所以这里是更新的代码:
void createDeck(vector<Card>& myDeck)
Card card;
for(int i=0; i < 52; i++)
card.setRank(i);
card.setSuit(i);
myDeck.push_back(card);
int main()
vector<Card> theDeck;
theDeck.reserve(52);
createDeck(theDeck);
Card someCard;
for(int i = 0; i < 52; i++)
cout << theDeck[i].toString();
return 0;
【讨论】:
我只想对“更好地使用 .at”提出异议。在这种情况下,数组大小在程序中是有界的,测试也是如此。我们正在处理一个已知有 52 张牌的牌组。为简洁起见,并且由于您不建议使用异常处理块来捕获std::range_error
,因此最好使用普通的operator[]
。如果您养成在生产环境中对所有矢量访问器使用.at
的习惯,那么您将得到的只是惹恼您的技术主管。 ;)
附加说明:更有用的建议是在循环之前调用myDeck.reserve(52)
。这实际上是很少有开发人员会做的事情,但在某些情况下会产生巨大的性能影响。这是我全心全意推荐的习惯。
如果您的编译器支持它,我会研究语法糖“for(const auto&card :cards) card.toString();”,甚至研究 std::foreach :)。 PS:toString 方法必须是 const 才能使语法起作用...如果不是这样,请删除 const 关键字。【参考方案2】:
为什么main
需要知道一副牌中正好有 52 张牌?如果没有这些知识,它也可以很容易地工作。
int main()
std::vector<Card> theDeck = createDeck();
for(Card card : theDeck)
std::cout << card.toString();
您可能希望在程序的多个地方输出Card
s,为什么所有这些地方都必须知道有一个toString
方法提供Card
的表示?您可以通过定义一个
<<
值转换为流
std::ostream& operator<< (std::ostream& os, Card card)
return os << card.toString(); // or moving the body of toString here
然后你可以将std::copy
套牌变成std::cout
int main()
std::vector<Card> theDeck = createDeck();
std::copy(theDeck.begin(), theDeck.end(), std::ostream_iterator<Card>(std::cout));
【讨论】:
以上是关于在 C++ 中对自定义对象的向量进行操作 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 prestashop 1.7 中对自定义页面进行 ajax 请求