C++ 尝试对c++;

C++ 尝试对c++;,c++,list,sorting,C++,List,Sorting,我试图通过将填充有随机值的用户集长度列表传递给将按升序排序元素的函数来对数字列表进行排序 我在使用数组之前就已经解决了这个问题,没有任何问题。出于某种原因,我的代码不起作用,如果你们能帮我找出它不起作用的原因,我将不胜感激。它将对数字进行排序,但最后一个数字将被取消排序 以下是函数: void sort(std::list<int>& numbers) { list<int>::iterator it; list<int>::itera

我试图通过将填充有随机值的用户集长度列表传递给将按升序排序元素的函数来对数字列表进行排序

我在使用数组之前就已经解决了这个问题,没有任何问题。出于某种原因,我的代码不起作用,如果你们能帮我找出它不起作用的原因,我将不胜感激。它将对数字进行排序,但最后一个数字将被取消排序

以下是函数:

void sort(std::list<int>& numbers)
{
    list<int>::iterator it;
    list<int>::iterator it2;
    for (it = numbers.begin(); it != numbers.end(); ++it)
    {
        for (it2 = ++numbers.begin(); it2 != numbers.end(); ++it2)
        {
            if (*it > *it2)
            {
                int temp = *it;
                *it = *it2;
                *it2 = temp;
            }
        }
    }
}
void排序(标准::列表和编号)
{
列表::迭代器;
列表::迭代器it2;
for(it=numbers.begin();it!=numbers.end();+it)
{
对于(it2=++numbers.begin();it2!=numbers.end();++it2)
{
如果(*it>*it2)
{
int temp=*it;
*it=*it2;
*it2=温度;
}
}
}
}

您的算法不起作用,因为第二个循环总是(几乎)一次又一次地遍历整个列表。它应该做的,是只通过剩余的部分。 即,第二个周期应为:

for (it2 = std::next(it1); it2 != numbers.end(); ++it2)
另外,由于第二个周期从“下一个”元素开始,所以第一个周期不应该一直持续到最后一个元素,而是应该持续到倒数第二个元素。 也就是说,类似这样的事情:

for (it = numbers.begin(); it != std::prev(numbers.end()); ++it)
但是,由于
std::prev()
仅为双向迭代器定义,并且
std::list
不提供双向迭代器,因此可能更容易将其重写为:

for (it = numbers.begin(); std::next(it) != numbers.end(); ++it)

除非它是实现您自己排序的任务的一部分,否则请使用(或在
std::list
,的情况下)。您是否尝试调试此功能?谢谢,剪切和粘贴“for(it2=std::next(it1);it2!=numbers.end();+it2)”有效。我刚刚学习了迭代器,所以我认为“++”就可以了。