0

我试图弄清楚如何为指向 Item 类对象的 Item Pointer 类实现 operator< 重载。它是存储指向 STL 集中项的指针的程序的一部分。对于有序的 STL 集(按标题字母顺序),重载是必需的。我知道下面的 ItemPtr 重载的代码是错误的。我以为我可以取消引用指针以获取实际项目,但我不知道如何实现这一点。我希望我走在正确的轨道上。我感谢任何人可以分享的任何指针(没有双关语)。

bool operator<(const Item& i1, const Item& i2)
{
    const char* str1 = i1.getTitle().c_str();
    const char* str2 = i2.getTitle().c_str();
    return strcmp(str1, str2);
}

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2)
{
    const Item& i1 = *ip1;
    const Item& i2 = *ip2;
    return i1 < i2;
}

谢谢。

4

2 回答 2

2

set最简单的方法,假设您保证andgetTitle()中没有无效指针const

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2)
{
  return ip1->getTitle() < ip2->getTitle();
}

但是,我会警告说,需要做这种事情会触发我的感觉,即您的设计可能有问题。特别是,你为什么将指针存储Item在你的set,而不仅仅是它Item本身?这真的需要吗?

于 2013-06-12T16:26:16.930 回答
0

您的实现中的错误不是比较ItemPtrs,而是比较Items:strcmp()将在str1str2不同时返回非零值,并且返回非零值意味着true. a < b如果并且b < a同时,您将无法获得有序元素。因为ItemPtr比较是作为比较的函数来实现的Item,所以会有同样的问题。

如果您确定ItemPtr始终包含有效的Item参考,那么 John Dibling 给出的解决方案既简单又正确:

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2)
{
    return ip1->getTitle() < ip2->getTitle();
}

如果您仍然需要比较Items:

bool operator<(const Item& i1, const Item& i2)
{
    return i1.getTitle() < i2.getTitle();
}
bool operator<(const ItemPtr& ip1, const ItemPtr& ip2)
{
    return *i1 < *i2;
}

如果您不能假设ItemPtr存储一个有效的参考,您将不得不检查这种情况。(但也许你可以假设)。

于 2013-06-17T14:30:07.013 回答