【问题标题】:How use std::multiset with multiple comparator function?如何将 std::multiset 与多个比较器功能一起使用?
【发布时间】:2011-04-29 16:23:59
【问题描述】:

下午好,我有一个 C++ 类 Range,它实现了 operator <std::multiset<Range> ranges_type 使用。

由于多重集构造函数没有指定自定义比较器函子,它使用std::less operator <

但是,我需要为std::multiset ranges_type 使用第二个比较器函子。具体来说,我会指定第二个比较器: std::multiset<Range, PointerCompare> struct PointerCompare 看起来是这样的:

struct PointerCompare{
   bool operator()(const Range& a, const Range& b) const {
         return (a.mPtr == b.mPtr)
   }

是否可以将std:multiset 与多个比较器功能一起使用,或者是否有解决方法?谢谢

Range 类看起来是这样的:

class Range { 
     public:   
         explicit Range(int item){ 
            mLow = item;
            mHigh = item;
            mPtr  = 0;
         }
         Range(int low, int high, char* ptr = 0,char* mapptr = 0){ 
            mLow = low;
            mHigh = high;
            mPtr  = ptr;

         }
         Range(void){  
            mLow = 0;
            mHigh = 0;
            mPtr  = 0;

         }

         Range(const Range& r):
            mLow(r.mLow),
            mHigh(r.mHigh),
            mPtr(r.mPtr)
         {

         }


         bool operator==(const Range& rhs) const{
             return (mLow <= rhs.mLow && mHigh >= rhs.mHigh);
         }
         bool operator<(const Range& rhs) const{               
            return mHigh < rhs.mHigh;      
         } 
         int low() const { return mLow; }   
         int high() const { return mHigh; }
         char* getPtr() const { return mPtr; }
     private:   
         int mLow;   
         int mHigh; 
         char* mPtr;
}; // class Range 

【问题讨论】:

  • 我不明白你为什么想要多个比较器。这有什么意义? std::multiset&lt;Range, PointerCompare&gt; 有什么问题?
  • 另外,请注意您的格式。您应该使用“{}”按钮格式化代码 sn-ps。我已经为你做了这个,但你已经编辑了你的问题并再次打破了它!
  • Oli Charlesworth:我需要使用两个比较器,因为我使用:std::multiset::const_iterator iter = range_type.lower_bound(Range(n)); if(iter == range_type.end() || iter->low() > n){ found = false;} else{ curr = *iter;找到=真; }
  • @Frank:我不确定我是否理解。您是说您希望能够以不同的排序顺序遍历您的多重集吗?这是不可能的(因此您需要找到不同的数据结构)。如果那不是您想要的,那么您所做的就是正确的;即提供自定义比较器作为模板参数。
  • Oli Charlesworth:我需要使用两个比较器,因为我使用:std::multiset::const_iterator iter = range_type.lower_bound(Range(n)); if(iter == range_type.end() || iter->low() > n){ found = false;} else{ curr = *iter;找到=真; }。我需要使用像这样的第二个比较器 std::multiset::iterator iter = find(range_types.begin(), range_type.end(),curr); range__type.erase(iter) 。谢谢你 。对于破坏您的编辑,我深表歉意。

标签: c++ visual-c++ stl


【解决方案1】:

听起来你最好使用Boost::MultiIndex 中的一些东西,而不是试图将几个不同的比较器函数强制到一个std::multiset 上。他们有一堆不同的容器类型 (see here。) 特别是我会看看 ordered_indices 版本。

【讨论】:

  • @wheaties,谢谢你的回答。我们不能使用 Boost,因为我们没有为最新的 Solaris UNIX、IBM AIX 或 HPUX 许可付费。为了使用 Boost 发行版,我们需要拥有最新的 Solaris UNIX、IAM AIX 和 HPUX 许可证。是否有指向实现最小版本ordered_indices 的自定义C++ 类的链接?谢谢。
  • @Frank:从什么时候开始需要付费才能使用 Boost?
  • @Oli Charlewsworth,我们不需要在 Boost 中支付任何费用是正确的。但是,我去年在一个项目中尝试使用 Boost::regex,而 Solaris、IBM AIX 和 HPUX 编译器使用 Boost Code 产生了许多编译器错误,我们被告知如果购买了最新的 UNIX 许可证,Boost 编译器错误就会消失。谢谢。
  • @Frank 谁告诉你的?供应商?有些库不适用于较旧的编译器,有些则可以。您必须阅读文档,因为大多数库都非常明确地说明了哪些会/不会起作用。也就是说,我相信这是应该工作的那些库之一。
  • @wheaties,我们上一次购买 Solaris、IBM AIX 和 HP UX 的 UNIX 许可证是在 2005/2006 年。从那时起,Boost 发生了重大变化。这就是我们在尝试构建 boost regex 库时遇到所有 UNIX 编译器错误的原因。谢谢
【解决方案2】:

我可能已经找到了多个比较器功能的解决方法:这里是:

范围 targetRange = Range(PreviousNCopy,PreviousN, TmpPrevMapPtr);

bool Found = std::binary_search(ranges_type.begin(), range_type.end(), 目标范围,我的比较器());

其中:MyComparator 是一个结构体: 结构 MyComparator {
bool 运算符 () ( const Range& d1, const Range& d2 ) const {
返回 d1.getPtr() } };

std::binary_search 需要 o(log n) 时间,但 std::multiset range_type 必须始终保持排序。谢谢。

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2015-12-12
    相关资源
    最近更新 更多