代码中的c ++ 2D向量push_back错误

Posted

技术标签:

【中文标题】代码中的c ++ 2D向量push_back错误【英文标题】:c++ 2D vector push_back error in code 【发布时间】:2014-07-29 03:51:20 【问题描述】:

我让我的程序使用单个向量,并决定使用 2D 向量来表示多只手(一维向量 vPlayerHand1 加上一维向量 vPlayerHand2 加上 ...)。我不知道如何填充向量。我正在使用 Visual Studio C++ 2010,它似乎没有完全实现 C++11,并报告 IDE 中的代码解析错误,这些代码作为本论坛中类似问题的答案提供。在下面的大纲中 Card 是一个类。

#include <vector>

std::vector<std::vector<Card>> vPlayerHand;

vPlayerHand.push_back(vShoe.back());  /* fails with parsing error No instance of 
                                         overloaded function... */
vPlayerHand[0].push_back(vShoe.back());  /* builds okay then error Debug Assertion
                                            Failed... vector subscript out of range */

我在正确使用带有 2D 向量(向量的向量)的 push_back 函数方面遗漏了一些东西,我知道第一个参考是行。当我使用 push_back 填充时,它应该只做第一行。

这里是更完整的代码:

在第 29 行编辑...代码按照给定的方式正确运行 根据@RSahu 的解决方案在第32a 行重新编辑运行正确。注释掉第 29 行

1  # include <iostream>
2  # include <vector>
3  # include <algorithm>
4  # include <ctime> 
5  # include "Card.h"  //Defines Card as having Suit, Rank and functions GetSuit()   GetRank()
6
7  std::vector<Card> vShoe;                  //Card Shoe vector holds 1-8 decks
8  std::vector<Card> vDeck;                  //Deck vector holds 52 cards of Card class
9  std::vector<std::vector<Card>> vPlayerHand; // Player Hands 0-original, 1-split1, n-splitn
10 std::vector<Card> vDealerHand;
11
12 void CreateDeck();       //Populates Deck with 52 Cards 
13 void CreateShoe(int);   //Populates Show with Decks*n number of Decks
14 void ShuffleShoe();      // uses random_shuffle
15 
16 int main() 
17 
18 int iDeckCount = 2;
19 const int NumPlayers = 1;
20 srand(time(0)); 
21 
22 
23 CreaateDeck();
24 CreateShoe(iDeckCount);
25 ShuffleShoe();
26 
27 // Following line gives parsing error
28 // vPlayerHand = std::vector<std::vector<Card>> (5, std::vector<std::vector<Card>>(12));

    // added this line and now runs as expected
    /* removed this line in favor of line 32a as per @RSahu  
29 vPlayerHand.resize(2);  // need only initial size for 2 elements
    */

30 for (int i=0; i<=NumPlayers; i++) 
31      // I believe this is where dimension error comes vPlayerHand[0].push_back
32      // I tried vPlayerHand.push_back(vShoe.back()) but get parsing error "No instance of overloaded function.."

        // This line added as per R Sahu.  compiles and runs correctly
32a     vPlayerHand.push_back(std::vector<Card>());
33      vPlayerHand[0].push_back(vShoe.back()); //Top card in Shoe (last card in vector) is dealt to Player
34      vShoe.pop_back();                       //Top card in Shoe is removed (destroyed) from vector Shoe
35      vDealerHand.push_back(vShoe.back());    //Top card in Shoe (last card in vector) is dealt to Dealer
36      vShoe.pop_back();                       //Top card in Shoe is removed (destroyed) from vector Shoe
37      
38 
39 /* Show Results
40  std::cout << "\n---------------------------------\n" ;
41  std::cout << "   Players Hand" << std::endl;
42  std::cout << vPlayerHand[0][0].GetRank() << "," << vPlayerHand[0][0].GetSuit() << " ";
43  std::cout << vPlayerHand[0][1].GetRank() << "," << vPlayerHand[0][1].GetSuit() << std::endl;
44 */
45 

任何见解都会有所帮助。

【问题讨论】:

发布代码时,去掉行号,方便复制/粘贴/编译/运行 我认为这些数字会有所帮助。从阅读其他帖子中不清楚数字是有益的还是有害的。以后我会省略这些数字,因为添加它们很痛苦。 @NipperDJ 不发布行号,但指出哪一行对应于任何错误消息中出现的哪个数字 【参考方案1】:

您已将vPlayerHand 定义为:

std::vector<std::vector<Card>> vPlayerHand;

当您使用 vPlayerHand.push_back(arg) 时,arg 必须是 std::vector&lt;Card&gt; 类型或可转换为 std::vector&lt;Card&gt;Card 类型的参数不能用作该函数的参数。这就是你在使用时所尝试的

vPlayerHand.push_back(vShoe.back())

你需要的是:

vPlayerHand.push_back(std::vector<Card>());
vPlayerHand.back().push_back(vShoe.back());
vShoe.pop_back();
vPlayerHand.back().push_back(vShoe.back());
vShoe.pop_back();

【讨论】:

@NipperDJ,但vShoe.back() 不是。 vShoe.back() 的返回类型为Card 在我的代码中,vShoe 是 Card (str::vector vShoe;) 类型的向量,所以我不太遵循您提供的第一行......这似乎是多余的。但我确实通过添加以下行找到了解决方案: vPlayerHand.resize(2);我编辑了我的代码,它现在运行如图所示。尽管如此,我会投票给你一个答案。我将使用您提供的代码进行测试。我有很多关于 C++ 的知识要学习。谢谢。 哦……我现在明白了。非常感谢。正如您所指出的,我正在填充 push_back 但使用了错误的参数。通过使用 resize 我创建了 Card 类型的元素,然后我使用了 push_back 就可以了。 @NipperDJ,第一行添加一个空的vector&lt;Card&gt;vPlayerHand。如果vPlayerHand 为空,vPlayerHand.back().push_back(vShoe.back()); 将导致未定义的行为。 你是最棒的!!我已经阅读了数十篇与此相关的帖子和​​几页参考资料,但从未理解您刚刚向我说明的内容。感谢您的才华和清晰的解释。

以上是关于代码中的c ++ 2D向量push_back错误的主要内容,如果未能解决你的问题,请参考以下文章

Malloc 错误:OpenCV/C++ 而 push_back 向量

2D 向量 push_back

将 1D 向量作为行推入 2D 向量数组

执行 push_back 后,集合的 C++ 向量给出分段错误

指向向量的 C++ 指针

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)