C++ 对包含圆圈c+的列表进行排序+;

C++ 对包含圆圈c+的列表进行排序+;,c++,templates,lambda,C++,Templates,Lambda,我想运行以下简单代码: #include <cstdlib> //std :: rand () #include <vector> //std::vector<> #include <list> //std::list<> #include <iostream> //std::ostream_iterator #include <iterator> //std:: cout std::ostream_iterat

我想运行以下简单代码:

#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;
    }

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

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

相关问题/答案


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


大括号中也有错误。这是一段自包含且可编译的代码。它显示了
std::sort
vector
以及
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;
}


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

完整的错误消息?编译器?您不能使用
std::sort
列表进行排序。使用
vector
@Csq或
list.sort()
-std=c++11
添加到编译器选项中,否则gcc不知道lambda是什么。相关:除上述内容外,您的比较器也错误。标准库排序(列表、自由函数或其他)的比较器必须强制执行严格的弱顺序,而您的则不能。与
一样,如果我放置lk.sort而不是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;
}
g++ -std=c++11 -Wall -Wextra filename.cpp