gpt4 book ai didi

c++ - 对不同变量的 vector 使用排序功能

转载 作者:行者123 更新时间:2023-12-02 10:11:08 25 4
gpt4 key购买 nike

我有以座标给出的数据。我建立了他们的类(class),这些类(class)是这样组成的:

Point2D (int x, int y)

Point3D (int z) //#include Point2D.h

Line2D (Point2D pt1, Point2D pt2)

Line3D (Point3D pt1, Point3D pt2)
现在,我应该能够根据任何过滤条件(每个类都是过滤条件),任何排序条件( x, y, z或它们的乘积)和排序顺序(升序或降序)对数据进行排序
筛选条件指定要显示的记录集。
我创建了一个通用的排序算法,但是应该使用STL算法中的排序功能。我将算法粘贴到下面,但是有人可以使用 std::sort函数将其简化。
void sort(
vector<Point2D*>& point2DList,
vector<Point3D*>& point3DList,
vector<Line2D*>& line2DList,
vector<Line3D*>& line3DList,
string filterCriteria, string sortingCriteria, string sortingOrder)
{
if (filterCriteria == "Point2D")
{
for (int i = 0; i < (int)point2DList.size() - 1; i++)
{
int index = i;
for (int j = i + 1; j < point2DList.size(); j++)
{
if (sortingOrder == "ASC")
{
if ((sortingCriteria == "x-ordinate" && point2DList[index]->getX() > point2DList[j]->getX()) ||
(sortingCriteria == "y-ordinate" && point2DList[index]->getY() > point2DList[j]->getY()))
index = j;
}
else if (sortingOrder == "DSC")
{
if ((sortingCriteria == "x-ordinate" && point2DList[index]->getX() < point2DList[j]->getX()) ||
(sortingCriteria == "y-ordinate" && point2DList[index]->getY() < point2DList[j]->getY()))
index = j;
}
}
Point2D* ptr = point2DList[i];
point2DList[i] = point2DList[index];
point2DList[index] = ptr;
}
}
}
我只粘贴了涉及 Point2D对象的算法的第一部分,我对其他3个类也应用了相同的流程。

最佳答案

据我所知,您正在使用单个sort函数(非模板)对不同的数据结构进行排序。这不是您使通用排序功能的方式。您需要使用function templates
其次,指向这些数据结构的原始指针的 vector 看起来不合适。 std::vector创建/在空闲存储中动态分配其下划线数据,这意味着您无需将其每个元素都放入手动创建的内存中。如果无法避免,我建议使用smart pointers而不是原始指针。
第三,filterCriteriasortingOrdersortingCriteria可能是 enum s而不是std::string
以下是修改后的sort函数,该函数实际上仅考虑您使用 std::sort 的要求。还要注意,我已经使用lambda functions作为自定义排序标准,您可以在此处阅读更多内容:What is a lambda expression in C++11?

// enumerations  for case checking!
enum class FilterCriteria { Point2D = 0, Point3D/*, other cases*/ };
enum class SortingCriteria { x_ordinate = 0, y_ordinate };
enum class SortingOrder { ASC = 0, DSC };

void sort(
std::vector<Point2D*>& point2DList,
std::vector<Point3D*>& point3DList,
std::vector<Line2D*>& line2DList,
std::vector<Line3D*>& line3DList,
const FilterCriteria filterCriteria,
const SortingOrder sortingOrder,
const SortingCriteria sortingCriteria)
{
const auto xLessCompare = [](const Point2D* lhs, const Point2D* rhs) { return lhs->x < rhs->x; };
const auto yLessCompare = [](const Point2D* lhs, const Point2D* rhs) { return lhs->y < rhs->y; };
const auto xGreaterCompare = [](const Point2D* lhs, const Point2D* rhs) { return lhs->x > rhs->x; };
const auto yGreaterCompare = [](const Point2D* lhs, const Point2D* rhs) { return lhs->y > rhs->y; };

switch (filterCriteria)
{
case FilterCriteria::Point2D:
{
if (sortingOrder == SortingOrder::ASC)
{
if (sortingCriteria == SortingCriteria::x_ordinate)
std::sort(point2DList.begin(), point2DList.end(), xGreaterCompare);
else if (sortingCriteria == SortingCriteria::y_ordinate)
std::sort(point2DList.begin(), point2DList.end(), yGreaterCompare);
}
else if (sortingOrder == SortingOrder::DSC)
{
if (sortingCriteria == SortingCriteria::x_ordinate)
std::sort(point2DList.begin(), point2DList.end(), xLessCompare);
else if (sortingCriteria == SortingCriteria::y_ordinate)
std::sort(point2DList.begin(), point2DList.end(), yLessCompare);

}
break;
}
case FilterCriteria::Point3D: {
// ... code
break;
}
default: break;
};
}
See here for an example code onlone

关于c++ - 对不同变量的 vector 使用排序功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63543686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com