排序包含圆圈的列表

sorting a list containing circles c++

本文关键字:列表 包含圆 排序      更新时间:2023-10-16

我想运行这个简单的代码:

#include <cstdlib> //std :: rand ()
#include <vector> //std::vector<>
#include <list> //std::list<>
#include <iostream> //std::ostream_iterator
#include <iterator> //std:: cout std::ostream_iterator
#include <algorithm> //std::reverse, std::generate
#include <map>
#include "ColorRGB.hpp"
#include "point2d.hpp"
#include "circle.hpp"
#include <cmath>
int main(){
std::list<Circle>lk; 
    Point2d a(7.5,3.2);
    Point2d b(6.5,2.2);
    Point2d c(5.5,1.2);
    ColorRGB d(0, 0, 0);
    ColorRGB e(0, 1, 1);
    ColorRGB f(1, 1, 0);
    Circle c1(a, 2, d);
    Circle c2(b, 1, e);
    Circle c3(c, 0.4, f);
    lk.push_back(c1);
    lk.push_back(c2);
    lk.push_back(c3);
sort(lk.begin(), lk.end(), [] (Circle const& lhs,Circle const& rhs)
    ->bool{return(lhs.getrad() <= rhs.getrad())};
    return 0;
    }

但是得到编译消息:

Juliuss-MacBook-Pro-2:uebung4 JONG$ g++ -o 4_1 4_1.cpp
4_1.cpp:42:30: error: expected expression
    sort(lk.begin(), lk.end(), [] (Circle const& lhs,Circle const& r...
                               ^
1 error generated.

不能使用std::sortlist进行排序,因为std::sort需要随机访问迭代器,而list只有双向迭代器。

使用vector代替。或者,如果坚持使用list,则有一个名为list.sort()的成员函数。它也可以接受自定义比较器。

相关问题/答案在这里


同样,在问题中使用SSCCE。这意味着要尽可能地摆脱/提供自定义类的代码。


括号中也有错误。这是一个自包含的代码,也可以编译。它显示了std::sortvector以及list::sort函数的用法:

#include <list>
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
class Circle
{
    int r;
public:
    Circle(int r) : r(r) {}
    int getrad() const { return r; }
};
int main(){
    std::vector<Circle> vk;
    std::list<Circle> lk;
    Circle c1(2);
    Circle c2(1);
    Circle c3(3);
    vk.push_back(c1);
    vk.push_back(c2);
    vk.push_back(c3);
    lk.push_back(c1);
    lk.push_back(c2);
    lk.push_back(c3);
    std::sort(vk.begin(), vk.end(),
        [] (const Circle& lhs, const Circle& rhs) -> bool {
            return lhs.getrad() < rhs.getrad();
        });
    lk.sort(
        [] (const Circle& lhs, const Circle& rhs) -> bool {
            return lhs.getrad() < rhs.getrad();
        });
    return 0;
}

我还是推荐vector


OPs更新后:

正如@nwp指出的,如果使用lambas,请使用c++ 11编译器:

g++ -std=c++11 -Wall -Wextra filename.cpp

正如@WhozCraig所指出的,比较器也需要修复。

相关文章: