在C++中对矢量进行分组

1 c++ vector std visual-c++

我有一个std :: vector的对象,每个对象都有一个与之关联的数字组标识符.该对象还具有诸如"size"和"name"之类的属性.

我需要能够按名称,大小和其他属性对对象的矢量进行排序,同时保持它们组合在一起(例如,通过上面提到的组标识符).

如何实现这一目标?

And*_*erd 6

使用STL,可以直接插入自己的比较函数.您想要定义一个比较函数,首先比较组,然后比较其他属性.

static bool CompareWidget(const Widget& w1, const Widget& w2)
{
    if(w1.GetGroupNumber() != w2.GetGroupNumber())
        return (w1.GetGroupNumber() < w2.GetGroupNumber());
    if(w1.GetHeight() != w2.GetHeight())
        return (w1.GetHeight() < w2.GetHeight();
    /// etc
    return false;
}


 static void SortWidgetVector(WidgetVector& widgetVector)
 {
      std::sort(widgetVector.begin(), widgetVector.end(), CompareWidget);
 }
Run Code Online (Sandbox Code Playgroud)


Pav*_*aev 5

首先,让我们重新解释一下这个问题.你真正想要的是按组ID排序对象,然后按(名称,大小,......)排序.如果您首先按组ID对它们进行排序,那么显然,具有相同组ID的对象将粘在一起.

显然可以使用自定义谓词轻松完成std::sort.这些方面的东西:

struct MyPredicate {
  bool operator() (const MyClass& lhs, const MyClass& rhs) const {
    if (lhs.groupID != rhs.groupID) {
      return lhs.groupId < rhs.groupId;
    } else if (lhs.name != rhs.name) {
      return lhs.name < rhs.name;
    else
      return lhs.size < rhs.size.
    }
  }
};

std::sort(myObjects.begin(), myObjects.end(), MyPredicate());
Run Code Online (Sandbox Code Playgroud)

  • 将比较函子作为函数对象而不仅仅是普通函数编写的主要原因是,您可以在需要类型的地方重用它们(例如`std :: map` comparer).这个名字是随机的,因为没有足够的输入信息来提出一个好名字:) (2认同)
  • @Frerich这只适用于C++ 11.你可以在C++ 03中声明一个像这样的本地结构,但你不能将它用作模板类型参数(VC++允许这样做,但它总是一个语言扩展,g ++会咆哮你). (2认同)