我需要知道如何使用其元素对用户定义类的向量进行排序。 假设我有一个名为“coordinates”的类,其中getX和getY方法返回一个int值。 我创建了矢量“vector PointTwoD vcP2D(5);”
的数组 class coordinates {
int getX();
int getY();
)
现在问题, 1)我需要使用getX()对矢量“vcP2D”进行排序,并按asc顺序排序 2)假设用户输入“2”作为x坐标。使用该信息我需要找到哪个向量包含2
请咨询
答案 0 :(得分:6)
这样做:
std::sort(v.begin(), v.end(), [](const coordinates& c, const coordinates& d){ return c.getX() < d.getX(); });
它使用C ++ 11 Lambda表达式作为std::sort
的二进制谓词。
#include <algorithm>
#include <vector>
#include <iostream>
struct coordinates
{
int x;
int y;
};
int main()
{
std::vector<coordinates> v{ {2,3}, {0,0}, {1,5} };
std::sort(v.begin(), v.end(), [](const coordinates& c, const coordinates& d) { return c.x < d.x; });
std::cout << "sorted by x values, values of \"x\": " << v[0].x << " " << v[1].x << " " << v[2].x << "\n";
std::sort(v.begin(), v.end(), [](const coordinates& c, const coordinates& d) { return c.y < d.y; });
std::cout << "sorted by y values, values of \"x\": " << v[0].x << " " << v[1].x << " " << v[2].x << "\n";
}
以同样的方式demo of how to find an element:
#include <algorithm>
#include <vector>
#include <iostream>
struct coordinates
{
int x;
int y;
};
int main()
{
std::vector<coordinates> v{ {2,3}, {0,0}, {1,5} };
auto result = std::find_if(v.begin(), v.end(), [](const coordinates& c){ return c.x == 1 && c.y == 5; });
if(result != v.end())
std::cout << "point (1,5) is number " << std::distance(v.begin(), result)+1 << " in the vector.\n";
else
std::cout << "point (1,5) not found.\n";
}
如果您要搜索已排序的向量,可以使用std::binary_search
进行比较功能(与上面的std::sort
相同)。它也没有为该元素提供迭代器,只有true
或false
。
答案 1 :(得分:3)
您需要使用operator< ()
或二元谓词在元素上定义严格的弱顺序,然后使用std::sort()
。
最简单的方法是创建小于operator<()
:
bool operator< (coordinates const& c0, coordinates const& c1) {
// return a suitable result of comparing c0 and c1 such that operator<()
// become a strict weak order
}
使用此std::vector<coordinates>
对std::sort()
进行排序只需使用std::lower_bound()
即可。要查找特定对象,请使用{{1}}。