如何在c ++中使用带有map的sort函数?

时间:2014-09-15 19:40:24

标签: c++ sorting c++11 vector

看看我的程序,我已经声明了一个地图对象的矢量。

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>

using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::string;
using std::vector;
using std::make_pair;
using std::multimap;
using std::sort;


int main(void)
{
    vector< multimap<string , string>  > data;

    data.resize(1);
    data[0].insert(make_pair("outlook","sunny"));
    data[0].insert(make_pair("wind","weak"));

    data.resize(data.size() + 1);

    data[1].insert(make_pair("outlook","sunny"));   
    data[1].insert(make_pair("wind","strong"));

    data.resize(data.size() + 1);

    data[2].insert(make_pair("outlook","overcast"));    
    data[2].insert(make_pair("wind","weak"));

    data.resize(data.size() + 1);

    data[3].insert(make_pair("outlook","rain"));    
    data[3].insert(make_pair("wind","weak"));

    data.resize(data.size() + 1);

    data[4].insert(make_pair("outlook","rain"));    
    data[4].insert(make_pair("wind","weak"));

    data.resize(data.size() + 1);

    data[5].insert(make_pair("outlook","rain"));    
    data[5].insert(make_pair("wind","strong"));


    sort(data.begin() , data.end() , []( vector< multimap<string,string> >  a ,  vector< multimap<string,string> >  b)
    {
        return a[0].find("outlook")->second < b[0].find("outlook")->second;
    });


    return 0;
}

我已经定义了一个排序函数来根据map的“outlook”索引对矢量条目进行排序,但是这个函数不起作用。 有谁能告诉我这个功能有什么问题和正确的排序方式?

1 个答案:

答案 0 :(得分:2)

std::sort的谓词将使用vector::value_type类型的参数调用,而不是vector自身。将lambda表达式更改为

[](multimap<string,string> const& a, multimap<string,string> const& b)
{
    return a.find("outlook")->second < b.find("outlook")->second;
}

const&不是必需的,但您可能希望每次调用谓词时都避免对multimap进行不必要的复制。您可能还想在引用结果之前检查multimap::find的结果。

而不是每次都致电vector::resize添加新的multimap,您可以致电

data.emplace_back();

将默认构建一个新的multimap