我有一个STL向量列表,我想按每个向量的第一个元素对它们进行排序

时间:2016-08-12 11:57:29

标签: c++ algorithm sorting vector stl

我有一份STL的矢量列表。它们有不同的长度,我想按每个向量的第一个元素对它们进行排序。例如,我有矢量:4 4 5 6 10,1 8 ,2 2 3和3 1 7 9.第一个数字是每个向量的大小,后面是向量的元素。我想在文件中显示向量,按第一个元素排序。在此示例中,我的矢量应按以下顺序显示:3 1 7 9,2 2 3,4 4 5 6 10和1 8

这是我的代码:

ofstream fout ("retele.out");
fout << T << '\n';
for (i=1; i<=T; i++)
{
    fout << sol[i].size() << ' ';
    sort(sol[i].begin(),sol[i].end());
    for (j=0; j<sol[i].size(); j++)
        fout << sol[i][j] << ' ';
    fout << '\n';
}
fout.close();

“T”是向量的数量。 “sort”函数用于对每个向量进行排序,我还需要另一种排序向量进行排序。

6 个答案:

答案 0 :(得分:6)

对其他答案的一个小澄清:std::vector<T>已经operator<与您描述的行为完全相同(cplusplus description)。

template < class T, class Alloc >
bool operator < (const vector<T, Alloc>& lhs, const vector<T, Alloc>& rhs);

说明

  

小于比较(运算符&lt;)表现得好像使用算法lexicographical_compare,其使用运算符&lt;顺序地比较元素。以互惠的方式(即检查&lt; b和b&lt; a)并在第一次出现时停止。

所以,你可以写

sort(sol.begin(), sol.end());

UP :您在评论中写道,您的数组为std::vector,而不是std::list<std::vector>。该数组没有方法begin()end(),因此这个确切的代码不起作用。解决方案是

sort(sol, sol + SIZE);

其中SIZE是要排序的数组部分的大小。

答案 1 :(得分:0)

根据此link答案:

您可以像这样创建比较方法:

bool compare_vec (const std::vector<int>& first, const std::vector<int>& second)
{
  return first[1]<second[1];
}

并致电:

sol.sort(compare_vec);

答案 2 :(得分:0)

查看this帖子。

bool myfunction (vector<int> i,vector<int> j) { return (i[0]<j[0]);}
struct myclass {
  bool operator() (vector<int> i,vector<int> j) { return (i[0]<j[0]);}
} myobject;


...
ofstream fout ("retele.out");
fout << T << '\n';
for (i=1; i<=T; i++)
{
    fout << sol[i].size() << ' ';
    sort(sol[i].begin(),sol[i].end(), myfunction);
    for (j=0; j<sol[i].size(); j++)
        fout << sol[i][j] << ' ';
    fout << '\n';
}
fout.close();

您必须实施自己的比较器,稍后将对其vectors列表进行排序。

答案 3 :(得分:0)

您可以遵循此算法:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbarSize="5dip"
    style="@style/CustomScrollBar">
    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="left"
        android:textSize="16sp"
        android:padding="5dp"
        style="@style/CustomTextView"/>
</ScrollView>

答案 4 :(得分:0)

STL函数std::sort包含可选谓词。 在这种情况下,我想你想写的类似:

std::sort(sol.begin(), sol.end(), [](const std::vector<int> &lhs, const std::vector<int> &rhs) { return lhs.front() < rhs.front(); });

请注意,如果列表包含空向量,此代码将崩溃。

如果问题是std::list,尽管评论中指出了c风格的数组std::vector<int> v[50001]。人们应该将其重写为:

std::sort(sol[0], sol[nofElementsFilledIn], [](const std::vector<int> &lhs, const std::vector<int> &rhs) { return lhs.front() < rhs.front(); });

答案 5 :(得分:0)

std::sort(MyVector.begin(), MyVector.end(), [](auto a, auto b) { return a.front() < b.front(); } );

我希望这可以对你的载体进行排序