在 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();
    

您可能希望在程序的多个地方输出Cards,为什么所有这些地方都必须知道有一个toString 方法提供Card 的表示?您可以通过定义一个

直接将&lt;&lt; 值转换为流
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++ 中对自定义对象的向量进行操作 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用于对包含指向自定义类对象的指针的向量进行排序的比较器

在python中对自定义类执行集合操作

如何在 Delphi 2009 中对自定义组件进行鼠标平移

如何在 prestashop 1.7 中对自定义页面进行 ajax 请求

无法在 Drupal 7 的视图中对自定义字段进行排序或过滤

如何在 C++ 中对向量组元素进行排序?