Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对向量进行排序<;配对<;字符串,成对<;int,int>&燃气轮机>;?_C++_Sorting_Stl - Fatal编程技术网

C++ 如何对向量进行排序<;配对<;字符串,成对<;int,int>&燃气轮机>;?

C++ 如何对向量进行排序<;配对<;字符串,成对<;int,int>&燃气轮机>;?,c++,sorting,stl,C++,Sorting,Stl,我希望能够对以下向量进行排序- 向量基于对的int第一,int,如果它们相等,然后根据它们的第二个元素排序它们,我如何在C++中使用STL的构造?< /p> 这类人必须在这方面有所作为 假设E1和E2是两个元素 如果E1.second.first==E2.second.first,则必须对第二个元素进行比较。sort(x.begin,x.end,[](const x&a,const x&b){返回a.second.first

我希望能够对以下向量进行排序- 向量<配对<字符串,配对< int,int > >基于对的int第一,int,如果它们相等,然后根据它们的第二个元素排序它们,我如何在C++中使用STL的构造?< /p> 这类人必须在这方面有所作为

假设E1和E2是两个元素

如果E1.second.first==E2.second.first,则必须对第二个元素进行比较。

sort(x.begin,x.end,[](const x&a,const x&b){返回a.second.firstsort(x.begin, x.end, [](const X & a, const X & b){return a.second.first < b.second.first ; }) ;
其中x是您的容器,x是元素的类型。

排序(x.begin,x.end,[](const x&a,const x&b){返回a.second.first

其中x是您的容器,x是元素的类型。

如果您不能使用C++11功能,您仍然可以执行以下操作:

typedef std::pair<std::string, std::pair<int, int>> AnkitSablok;

struct my_compare {
    bool operator()(const AnkitSablok &lhs, const AnkitSablok &rhs) const {
        return lhs.second < rhs.second;
    }
};

int main()
{
    std::vector<AnkitSablok> vec;

    std::sort(vec.begin(), vec.end(), my_compare());
}
typedef std::pair AnkitSablok;
结构我的比较{
布尔运算符()(常数AnkitSablok&lhs,常数AnkitSablok&rhs)常数{
返回左秒<右秒;
}
};
int main()
{
std::vec;
排序(vec.begin(),vec.end(),my_compare());
}

如果不能使用C++11功能,您仍然可以执行以下操作:

typedef std::pair<std::string, std::pair<int, int>> AnkitSablok;

struct my_compare {
    bool operator()(const AnkitSablok &lhs, const AnkitSablok &rhs) const {
        return lhs.second < rhs.second;
    }
};

int main()
{
    std::vector<AnkitSablok> vec;

    std::sort(vec.begin(), vec.end(), my_compare());
}
typedef std::pair AnkitSablok;
结构我的比较{
布尔运算符()(常数AnkitSablok&lhs,常数AnkitSablok&rhs)常数{
返回左秒<右秒;
}
};
int main()
{
std::vec;
排序(vec.begin(),vec.end(),my_compare());
}
[…]基于对的第一个元素,如果它们相等,则根据它们的第二个元素对它们进行排序[…]

std::pair
已具有词典比较C++03 20.2.2/6:

template <class T1, class T2>
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y);

Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second)
或者更通用的版本(取决于您的需要):

[…]基于对的第一个元素,如果它们相等,则根据它们的第二个元素对它们进行排序[…]

std::pair
已具有词典比较C++03 20.2.2/6:

template <class T1, class T2>
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y);

Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second)
或者更通用的版本(取决于您的需要):



你能解释一下你刚才做了什么吗?还有,你能修改一下打字错误吗?c:这是标准库中的排序函数+用作比较函数的lambda函数。在这种情况下,X应该是什么?你能解释一下你刚才做了什么吗?另外,你能修复打字错误吗?c:这是标准库中的排序函数+用作比较函数的lambda函数。在这种情况下,X应该是什么?它起作用了:D,感谢高炉这么好的回答:D,谢谢你,总的来说,你能解释一下如何完成这些工作吗?一些理论会很有用:)@evgenypanasuk:谢谢,我已经有一段时间没有使用严格的C++03编译器了。简单而整洁!这只是一个建议,既然你总是超载
()
,为什么不超载
operator@AnkitSablok:
std::sort
采用可选的比较函数。这需要是一个可调用的对象,如函数指针、函数对象或lambda。对于你的问题,我只发布了一个可能的解决方案。它奏效了:D,谢谢你这么好的回答:D,谢谢你,总的来说,你能告诉我如何完成这些工作吗?一些理论会很有用:)@evgenypanasuk:谢谢,我已经有一段时间没有使用严格的C++03编译器了。简单而整洁!这只是一个建议,既然你总是超载
()
,为什么不超载
operator@AnkitSablok:
std::sort
采用可选的比较函数。这需要是一个可调用的对象,如函数指针、函数对象或lambda。我只为你的问题发布了一个可能的解决方案。好的。这会让OP陷入昏迷,但我仍然喜欢它,特别是因为它是通用的。我拒绝回答+好的。这会让OP陷入昏迷,但我仍然喜欢它,特别是因为它是通用的。我拒绝回答+1.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <utility>
#include <vector>

struct LessSecond
{
    template<typename T, typename U>
    bool operator()(const std::pair<T,U> &x, const std::pair<T,U> &y) const
    {
        return x.second < y.second;
    }
};

int main()
{
    using namespace std;

    vector<pair<string , pair<int, int>>> x
    {
        {"1", {2, 1}}, {"2", {1, 1}}, {"3", {1, 2}}
    };
    sort(x.begin(), x.end(), LessSecond());
    for(const auto &p : x)
        cout << p.first << " (" << p.second.first << ", " << p.second.second << ")" << endl;
}
2 (1, 1)
3 (1, 2)
1 (2, 1)