C++ 在C++;
我有一个函数,它使用名为Card的自定义对象用52张卡片填充向量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
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));
}