【问题标题】:Using the overloaded operators ">" and "<" from the vector container in the C++ STL (Not dereferencable)在 C++ STL 中使用向量容器中的重载运算符“>”和“<”(不可取消引用)
【发布时间】: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 迭代器是随机访问迭代器,而迭代器上的 &lt;&gt; 等将完全独立于您是否为您的类定义这些运算符。
  • 我同意。我实际上离开了它是我的代码代码的方式,因为在尝试取消引用时它不起作用。我知道上面示例中使用的重载运算符实际上来自向量而不是来自我的类​​,这只是为了表示我想要的。我的问题是我没有意识到我实际上是在尝试取消引用一些没有不存在。谢谢

标签: c++ vector containers boolean-logic


【解决方案1】:

that 是一个参考。

变化:

bool operator>(const Guy& that) {return (this->bigness > that->bigness);}

收件人:

bool operator>(const Guy& that) {return (this->bigness > that.bigness);}

在测试之前确保您的vector 至少有一个元素:

vector<Guy> gang, mafia;

gang.push_back(Guy());  // Not sure you how you set 'bigness'.
mafia.push_back(Guy());

取消引用迭代器进行比较:

bool mafiaWins = (*mafia.begin() > *gang.begin()) ;

【讨论】:

  • 我们必须假设 OP 在写问题时只是打错了字;听起来他的代码可以编译并运行...
  • @OliCharlesworth,好的。下课后也缺少分号。
  • 是的,对不起。我实际上在帖子中输入了整个内容。我正在处理的代码太大了。它在不止一堂课之间进行。我只想问如何直接比较迭代器的表达式,因为我认为错误存在(在我的代码中,我实际上取消了对它们的引用,就像我在帖子中提到的那样)。我修正了这些小错误,感谢您指出这一点。
【解决方案2】:

只要向量有内容,这应该可以工作(如果它们是空的,我会得到一个段错误)。

bool mafiaWins = (*mafia.begin()) > (*gang.begin());

应该的

bool mafiaWins = mafia.front() > gang.front();

如果没有解决,请发布确切的错误。

注意:小于/大于运算符是为随机访问迭代器定义的,用于比较位置。

【讨论】:

  • 真的吗?我首先使用 .front() 和 .begin() 的原因是因为我认为如果向量为空,它不会给我一个断言错误。我会确保里面有内容,然后看看会发生什么。
  • 工作正常。我的错误是取消引用不存在的东西。
  • 即使 A 是一个有效的容器,A.begin() 也是定义明确的完全有效的迭代器——它等于A.end()..即使你有一个STL实现在你试图做无效的事情时抛出异常,你也不会得到A.begin() 调用的异常。 (但是,取消引用迭代器将是无效的。并且比较来自不同容器的迭代器将是无效的)
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 2022-01-05
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多