C++ 在C++;

C++ 在C++;,c++,function,loops,vector,cout,C++,Function,Loops,Vector,Cout,我有一个函数,它使用名为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 myDe

我有一个函数,它使用名为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;
}
vector createDeck(){
向量myDeck;
卡片;
对于(int i=0;i<52;i++){
卡.setRank(i);
卡套(i);
myDeck.向后推(卡);
}
返回我的甲板;
}
我主要调用这个createDeck()函数并使用它填充另一个向量:

int main() {
    vector<Card> theDeck;
    theDeck = createDeck();
    Card someCard;
    for(int i = 0; i < 52; i++){
        cout << theDeck(i).toString();
    }
}
intmain(){
向量切面;
theDeck=createDeck();
卡片;卡片;
对于(int i=0;i<52;i++){

cout问题在于线路:

cout << theDeck(i).toString();
更新: 根据paddy的评论,似乎
。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;
}
void createDeck(vector和myDeck){
卡片;
对于(int i=0;i<52;i++){
卡.setRank(i);
卡套(i);
myDeck.向后推(卡);
}
}
int main(){
向量切面;
代克储备(52);
createDeck(theDeck);
卡片;卡片;
对于(int i=0;i<52;i++){

难道为什么
main
需要知道牌组中正好有52张牌?如果没有这些知识,它同样可以轻松工作

int main() {
    std::vector<Card> theDeck = createDeck();
    for(Card card : theDeck){
        std::cout << card.toString();
    }
}
然后您可以
std::将组复制到
std::cout

int main() {
    std::vector<Card> theDeck = createDeck();
    std::copy(theDeck.begin(), theDeck.end(), std::ostream_iterator<Card>(std::cout));
}
intmain(){
std::vector theDeck=createDeck();
std::copy(theDeck.begin()、theDeck.end()、std::ostream_迭代器(std::cout));
}

您需要选中[i].toString();
。我只想对“更好地使用.at”提出异议。在这种情况下,数组大小在程序中是有界的,测试也是有界的。我们正在处理一个已知有52张卡的数据组。为了简洁起见,并且感谢您不建议使用异常处理块来捕获
std::range_error
,因此最好使用普通的
运算符[]
。如果您养成了在生产环境中对所有向量访问器使用
.at
的习惯,那么您所要做的就是惹恼您的技术负责人。;)附加说明:更有用的建议是致电
myDeck.reserve(52)
在循环之前。这实际上是很少有开发人员会做的事情,但在某些情况下会对性能产生巨大影响。这是我衷心推荐的一个习惯。如果您的编译器支持它,我会研究“for(const auto&card:cards)card.toString();”的语法,甚至是std::foreach:)。PS:toString方法必须是const,语法才能工作…如果不是这样,请删除const关键字。
std::ostream& operator<< (std::ostream& os, Card card)
{
    return os << card.toString(); // or moving the body of toString here
}
int main() {
    std::vector<Card> theDeck = createDeck();
    std::copy(theDeck.begin(), theDeck.end(), std::ostream_iterator<Card>(std::cout));
}