C++ 由用户定义类型can';t使用vector::erase();
尝试制作一个简单的纸牌游戏程序。我在C++ 由用户定义类型can';t使用vector::erase();,c++,C++,尝试制作一个简单的纸牌游戏程序。我在vector::erase()方面遇到了问题函数在类型为卡的向量上执行。它似乎无法使用它,因为vector::erase()中没有重载函数。这让我很困惑,因为向量是templated #include <iostream> #include <vector> #include <algorithm> enum card_suit {SPADE, CLUB, DIAMOND, HEART}; class Card; cla
vector::erase()方面遇到了问题代码>函数在类型为卡的向量上执行。它似乎无法使用它,因为vector::erase()中没有重载函数处理
的代码>。这让我很困惑,因为向量是template
d
#include <iostream>
#include <vector>
#include <algorithm>
enum card_suit {SPADE, CLUB, DIAMOND, HEART};
class Card;
class Player;
class Deck;
class Card
{
unsigned short rank;
card_suit suit;
public:
Card(unsigned short r, card_suit s)
{
rank = r;
suit = s;
}
bool operator == (Card& a)
{
if(this->rank == a.rank && this->suit == a.suit) return true;
else return false;
}
};
class Deck
{
std::vector<Card> cards;
public:
Deck& add_card(Card c)
{
cards.push_back(c);
return *this;
}
Deck& remove_card(Card c)
{
for(std::vector<Card>::iterator i=cards.begin(); i<cards.end(); i++)
{
if(*i==c) cards.erase(cards.begin()-i);
}
return *this;
}
Deck& shuffle()
{
}
};
class Player
{
Deck hand;
unsigned short points;
public:
Player()
{
points=0;
}
};
int main()
{
return 0;
}
#包括
#包括
#包括
enum card_套装{黑桃、梅花、钻石、心脏};
班级卡;
班级运动员;
舱面;
班级卡
{
无符号短秩;
卡丁套装;
公众:
卡片(无符号短r、卡片s)
{
秩=r;
西服=s;
}
布尔运算符==(卡和a)
{
如果(this->rank==a.rank&&this->suit==a.suit)返回true;
否则返回false;
}
};
甲板
{
向量卡;
公众:
卡组和添加卡(卡c)
{
卡片。推回(c);
归还*这个;
}
卡组和移除卡(卡c)
{
对于(std::vector::iterator i=cards.begin();i如果我没有遗漏什么,你只需要用cards.erase(cards.begin()-i);
替换为cards.erase(i);
。我真的不明白你说的代码是什么意思
好吧,如果说有效性,我想卡订单没有意义,我们可以使用这个功能:
std::vector<Card>::iterator i = std::find( cards.begin(), cards.end(), c );
if ( i != cards.end() ) {
if ( i != (cards.end()-1) )
*i = *(cards.end()-1);
cards.pop_back();
}
std::vector::iterator i=std::find(cards.begin(),cards.end(),c);
如果(i!=cards.end()){
如果(i!=(cards.end()-1))
*i=*(cards.end()-1);
扑克牌;
}
*建议的擦除-移除组合会产生矢量尾部的副本。如果我没有遗漏某些内容,您只需要替换卡。擦除(cards.begin()-I);
为卡。擦除(I);
。我真的不明白您所说的代码是什么意思
好吧,如果说有效性,我想卡订单没有意义,我们可以使用这个功能:
std::vector<Card>::iterator i = std::find( cards.begin(), cards.end(), c );
if ( i != cards.end() ) {
if ( i != (cards.end()-1) )
*i = *(cards.end()-1);
cards.pop_back();
}
std::vector::iterator i=std::find(cards.begin(),cards.end(),c);
如果(i!=cards.end()){
如果(i!=(cards.end()-1))
*i=*(cards.end()-1);
扑克牌;
}
*建议的“擦除-删除”组合会产生矢量尾部的副本。如果您只想删除一张卡,则不要删除此卡
if(*i==c) cards.erase(cards.begin()-i);
这样做:
if(*i==c) cards.erase(i);
如果您只想移除一张卡,那么请不要移除此卡
if(*i==c) cards.erase(cards.begin()-i);
这样做:
if(*i==c) cards.erase(i);
如果您正确掌握了基本语法和习惯用法,这通常是可行的:
for (std::vector<Card>::iterator it = cards.begin(), end = cards.end(); it != end; ++it)
{
if (c == *it)
{
cards.erase(it);
break;
}
}
这首先对向量的元素进行重新排序,以便所有与c
匹配的元素都位于末尾(remove
),然后(有效地)从向量中删除该结尾(erase
)。如果基本语法和习惯用法正确,通常应该可以这样做:
for (std::vector<Card>::iterator it = cards.begin(), end = cards.end(); it != end; ++it)
{
if (c == *it)
{
cards.erase(it);
break;
}
}
这首先对向量的元素进行重新排序,使所有与c
匹配的元素都位于末尾(remove
),然后(有效地)从向量中删除该结尾(erase
)。问题是:
cards.begin() - i
// ^^^^
此表达式的结果是ptr_差异。
而erase()方法使用迭代器
也许你的意思是:
cards.erase( i );
问题是:
cards.begin() - i
// ^^^^
此表达式的结果是ptr_差异。
而erase()方法使用迭代器
也许你的意思是:
cards.erase( i );
你能更具体地说明你遇到的错误吗?是编译时还是运行时?你的代码有几处错误,但是vector::erase()
未定义不是其中之一。说出您的实际错误/问题是什么。您能更具体地说明您遇到的错误吗?是编译时/运行时错误吗?您的代码有几处错误,但vector::erase()
未定义不是其中之一。请说出您的实际错误/问题是什么。这样做了。我假设向量迭代器的工作方式类似于指向数组的指针,因此我尝试将向量开头的地址减去找到该值的地址,以找到该值的序列号,然后将其删除.@Bacu-即使向量迭代器像指向数组的指针一样工作,并且erase()采用索引而不是迭代器,您的代码也不会工作。表达式cards.begin()-i
会产生零或负数,因此它只会在以下情况下给出正确的索引:i==cards.begin()
。指向数组的指针的行为确实类似于迭代器(但不一定相反),迭代器和指针的行为非常相似。索引的正确表达式是i-cards.begin()
。就是这样。我假设向量迭代器就像指向数组的指针一样工作,所以我试图用找到该值的地址减去向量开头的地址,以找到该值的序列号,然后将其删除。@Bacu-即使向量迭代器像这样工作,您的代码也不会工作e指向数组的指针和erase()采用的是索引而不是迭代器。表达式cards.begin()-i
的结果要么是零,要么是负数,因此它只会在以下情况下给出正确的索引:i==cards.begin()
。指向数组的指针的行为与迭代器类似(但不一定相反),并且迭代器和指针的行为非常相似。索引的正确表达式是i-cards.begin()
。你不认为我的建议更适合这种特殊情况吗?@tyz:好吧,如果没有维护元素顺序的要求,那么你有一个观点,但与其冒着代码其他用户可能不知道的未记录和令人惊讶的行为的风险,我可能会坚持删除/擦除,直到出现真正的错误这样做的理由很充分。你不认为我的建议更适合这个特殊的案例吗?@tyz:好吧,如果不需要维护元素的顺序,那么你就有理由了,但不是冒着未记录和意外的风险