Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用列表迭代器排序_C++_List_Sorting_Iterator_Linked List - Fatal编程技术网

C++ 使用列表迭代器排序

C++ 使用列表迭代器排序,c++,list,sorting,iterator,linked-list,C++,List,Sorting,Iterator,Linked List,问题:我有一个要在每个周期渲染的对象列表,但我希望按照y位置的顺序渲染它们,y位置是可变的 这是我的清单声明 std::list<Object *> objects; std::list<Object *>::iterator iter; std::list<Object *>::iterator iter2; 我想按y值的降序渲染对象。我想我真正的问题是如何对这个列表进行排序。std::list有一个排序函数,您可以将一个比较器传递给它,因此请编写如下其中

问题:我有一个要在每个周期渲染的对象列表,但我希望按照y位置的顺序渲染它们,y位置是可变的

这是我的清单声明

std::list<Object *> objects;
std::list<Object *>::iterator iter;
std::list<Object *>::iterator iter2;

我想按y值的降序渲染对象。我想我真正的问题是如何对这个列表进行排序。

std::list
有一个排序函数,您可以将一个比较器传递给它,因此请编写如下其中一个函数:

bool compareByGreaterY(const Object * lhs, const Object * rhs)
{
    return lhs->GetY() > rhs->GetY();
}
objects.sort(compareByGreaterY);
然后您可以对列表进行如下排序:

bool compareByGreaterY(const Object * lhs, const Object * rhs)
{
    return lhs->GetY() > rhs->GetY();
}
objects.sort(compareByGreaterY);

std::list
有一个排序函数,您可以将一个比较器传递给它,因此请编写如下其中一个函数:

bool compareByGreaterY(const Object * lhs, const Object * rhs)
{
    return lhs->GetY() > rhs->GetY();
}
objects.sort(compareByGreaterY);
然后您可以对列表进行如下排序:

bool compareByGreaterY(const Object * lhs, const Object * rhs)
{
    return lhs->GetY() > rhs->GetY();
}
objects.sort(compareByGreaterY);

首先,为什么要使用列表?这几乎总是一个糟糕的选择。为什么要使用指针容器?这比使用
list
更为频繁,但我们仍然只讨论了0.05%的时间,而不是0.02%。谁知道呢,在这种情况下,它甚至可能是最好的

不管怎样,我们暂时假设,出于某种原因,这些确实是有道理的。我还假设您不能修改原始集合(不清楚这是否为真——如果不是,只需跳过复制它,并对原始集合进行排序——但是如果出于某种原因不需要维护顺序,几乎可以肯定您并不真的想要列表

在这些假设下,您可能希望复制集合,对其排序,然后呈现:

struct descY { 
    bool operator()(Object const *a, Object const *b) { 
        return b.GetY() < a.GetY();
    }
};

std::vector<Object *> sorted(objects.begin(), objects.end());
std::sort(sorted.begin(), sorted.end(), descY());
struct descY{
布尔运算符()(对象常量*a,对象常量*b){
返回b.GetY()
如果您有可用的C++11,可以使用lambda将其缩短一点,并将逻辑保持在更容易看到发生了什么的位置,而无需在代码中寻找比较:

std::vector<Object *> sorted(objects.begin(), objects.end());
std::sort(sorted.begin(), sorted.end(), 
          [](Object const *a, Object const *b) { return b->GetY() < a->GetY();});
std::向量排序(objects.begin(),objects.end());
排序(sorted.begin(),sorted.end(),
[](对象常量*a,对象常量*b){返回b->GetY()GetY();});

请注意,为了获得降序,我们在比较中颠倒了通常的顺序。

首先,为什么要使用列表?这几乎总是一个糟糕的选择。为什么要使用指针容器?这有一个很好的理由,比使用
列表
更频繁一些,但我们仍然只讨论了0.05%的时间而不是0.02%。谁知道呢——在这种情况下,这可能是最好的结果

不管怎么说,我们暂时假设,出于某种原因,这些确实是有意义的。我还将假设您不能修改原始集合(不清楚这是不是真的——如果不是,就跳过复制它,对原始集合进行排序——但是如果出于某种原因不需要维护顺序,几乎可以肯定的是,它并不真的想要一个列表

在这些假设下,您可能希望复制集合,对其排序,然后呈现:

struct descY { 
    bool operator()(Object const *a, Object const *b) { 
        return b.GetY() < a.GetY();
    }
};

std::vector<Object *> sorted(objects.begin(), objects.end());
std::sort(sorted.begin(), sorted.end(), descY());
struct descY{
布尔运算符()(对象常量*a,对象常量*b){
返回b.GetY()
如果您有可用的C++11,可以使用lambda将其缩短一点,并将逻辑保持在更容易看到发生了什么的位置,而无需在代码中寻找比较:

std::vector<Object *> sorted(objects.begin(), objects.end());
std::sort(sorted.begin(), sorted.end(), 
          [](Object const *a, Object const *b) { return b->GetY() < a->GetY();});
std::向量排序(objects.begin(),objects.end());
排序(sorted.begin(),sorted.end(),
[](对象常量*a,对象常量*b){返回b->GetY()GetY();});
注意,为了得到降序,我们在比较中颠倒了通常的顺序