【发布时间】:2011-12-11 12:11:13
【问题描述】:
这是一个相当简单的问题,我认为它分解为这是否合法。我有一个“>”和“
下面是我所说的一个例子:
class Guy
{
double bigness; //I'm not illiterate by the way
public:
bool operator>(const Guy& that) {return (this->bigness > that.bigness);}
};
好的,这里应该可以了。现在我制作了两个类型为 guy 的向量,我想在一个表达式中比较两个成员,以便得到该表达式的真值,如下所示:
vector<Guy> gang, mafia;
bool mafiaWins = (*(mafia.begin()) > *(gang.begin()));
我没有填充向量,所以我不会从这段代码中得到任何合理的信息。但是我怎样才能让表达式 (mafia.begin() > gang.begin()) 起作用?我知道他们都在返回迭代器;但取消引用它们不起作用。使用 .front() 给我同样的错误。我得到一个断言,因为它有一个不可解引用的迭代器(它不应该是可解引用的吗?)。我想知道问题是否在于没有先将其存储在迭代器中......
感谢您的关注
解决方案:
所以,我上面的代码(从我第一次发布时编辑)应该适用于表达式。那不是我在 .cpp 中实际拥有的代码,这就是它如此混乱的原因。如果您只是试图到达向量的第一个成员,则不需要使用随机访问引用,并且 ,front() 将作为第一个术语的引用。我最初在这篇文章中将向量留空,因为我认为填充它们是无关紧要的,并且通过这样做我意外地发现了我的代码中的问题。我获取向量并检查其成员的功能不是检查我正在比较的成员是否存在。因此,对于遇到类似断言问题的任何人,您可能正在尝试取消引用不存在的东西。为了检查向量是否为空,可以使用一个成员函数。
Example:
bool thereIsWar = (!(mafia.empty() && !(gang.empty()));
if(thereIsWar)
bool mafiaWins = (*(mafia.begin()) > *(gang.being()));
希望对有类似问题的人有所帮助
【问题讨论】:
-
您的向量是空的,因此任一向量上的
.begin()都不会被取消引用。vector迭代器是随机访问迭代器,而迭代器上的<、>等将完全独立于您是否为您的类定义这些运算符。 -
我同意。我实际上离开了它是我的代码代码的方式,因为在尝试取消引用时它不起作用。我知道上面示例中使用的重载运算符实际上来自向量而不是来自我的类,这只是为了表示我想要的。我的问题是我没有意识到我实际上是在尝试取消引用一些没有不存在。谢谢
标签: c++ vector containers boolean-logic