如何仅根据三元组值对具有给定列的向量进行排序?
How to sort a vector with given column only on a triplet value?
我有一个包含三个 int
的结构。
struct x{
int a,
b,
c;
};
我正在使用该结构在向量中存储三元组,因为三元组将代表 source
、destination
和 weight
。
vector<x> myVec;
我用 myVec.push_back({a, b, c});
在其中添加值
到目前为止一切顺利,但我想根据权重对它们进行排序,这将是 c
变量。我不确定如何在我的矢量上使用 std::sort
。
您可以使用 lambda 表达式作为例子
#include <vector>
#include <iterator>
#include <algorithm>
// ...
std::sort( std::begin( myVec ), std::end( myVec ),
[]( const auto &a, const auto &b )
{
return a.c < b.c;
} );
您可以直接在std::sort
的调用中定义lambda表达式对象,如上所示,或单独定义,如下面的演示程序所示
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
struct x{
int a,
b,
c;
};
int main()
{
std::vector<x> myVec =
{
{ 2, 2, 2 }, { 1, 1, 1 }, { 3, 3, 3 }
};
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
auto compare_by_weight = []( const auto &a, const auto &b )
{
return a.c < b.c;
};
std::sort( std::begin( myVec ), std::end( myVec ), compare_by_weight );
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
return 0;
}
程序输出为
2 2 2
1 1 1
3 3 3
1 1 1
2 2 2
3 3 3
另一种方法是定义一个函数对象。例如。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
struct x{
int a,
b,
c;
};
struct compare_by_weight
{
bool operator ()( const x &a, const x &b ) const
{
return a.c < b.c;
}
};
int main()
{
std::vector<x> myVec =
{
{ 2, 2, 2 }, { 1, 1, 1 }, { 3, 3, 3 }
};
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
std::sort( std::begin( myVec ), std::end( myVec ), compare_by_weight() );
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
return 0;
}
程序输出为
2 2 2
1 1 1
3 3 3
1 1 1
2 2 2
3 3 3
我有一个包含三个 int
的结构。
struct x{
int a,
b,
c;
};
我正在使用该结构在向量中存储三元组,因为三元组将代表 source
、destination
和 weight
。
vector<x> myVec;
我用 myVec.push_back({a, b, c});
到目前为止一切顺利,但我想根据权重对它们进行排序,这将是 c
变量。我不确定如何在我的矢量上使用 std::sort
。
您可以使用 lambda 表达式作为例子
#include <vector>
#include <iterator>
#include <algorithm>
// ...
std::sort( std::begin( myVec ), std::end( myVec ),
[]( const auto &a, const auto &b )
{
return a.c < b.c;
} );
您可以直接在std::sort
的调用中定义lambda表达式对象,如上所示,或单独定义,如下面的演示程序所示
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
struct x{
int a,
b,
c;
};
int main()
{
std::vector<x> myVec =
{
{ 2, 2, 2 }, { 1, 1, 1 }, { 3, 3, 3 }
};
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
auto compare_by_weight = []( const auto &a, const auto &b )
{
return a.c < b.c;
};
std::sort( std::begin( myVec ), std::end( myVec ), compare_by_weight );
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
return 0;
}
程序输出为
2 2 2
1 1 1
3 3 3
1 1 1
2 2 2
3 3 3
另一种方法是定义一个函数对象。例如。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
struct x{
int a,
b,
c;
};
struct compare_by_weight
{
bool operator ()( const x &a, const x &b ) const
{
return a.c < b.c;
}
};
int main()
{
std::vector<x> myVec =
{
{ 2, 2, 2 }, { 1, 1, 1 }, { 3, 3, 3 }
};
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
std::sort( std::begin( myVec ), std::end( myVec ), compare_by_weight() );
for ( const auto &item : myVec )
{
std::cout << item.a << ' ' << item.b << ' ' << item.c << '\n';
}
std::cout << '\n';
return 0;
}
程序输出为
2 2 2
1 1 1
3 3 3
1 1 1
2 2 2
3 3 3