Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++;没有完成排序_C++_List_Sorting_Pointers_Shared - Fatal编程技术网

C++ 在c++;没有完成排序

C++ 在c++;没有完成排序,c++,list,sorting,pointers,shared,C++,List,Sorting,Pointers,Shared,我有一个STLstd::list,共有5个共享指针,指向需要按各自的id编号排序的节点对象 do { check = 0, i = 0; auto it = newList.begin(); while (i < newList.size() - 1) { first = *it; second = *++it; if (comp_id(first, second)) {

我有一个STL
std::list
,共有5个共享指针,指向需要按各自的
id
编号排序的节点对象

do
{
    check = 0, i = 0;
    auto it = newList.begin();

    while (i < newList.size() - 1)
    {
        first = *it;
        second = *++it;

        if (comp_id(first, second))
        {
            temp = second;
            second = first;
            first = temp;
            check = 1;
        }

        i++;
    }
} while (check == 1);
do
{
check=0,i=0;
auto it=newList.begin();
而(i
在这段代码中,
comp_id()
返回true,并在整个组织中运行,但在发生时,
列表中没有任何变化。我希望能从一些角度了解为什么会发生这种情况,以及如何解决它


另外,我不允许使用
list\u name.sort()
方法:(

该方法不起作用的原因是,您只修改了本地变量(
第一个
第二个
),它们是列表中值的副本。您根本没有修改列表的实际内容

要使代码正常工作,只需将
第一个
第二个
变量更改为列表迭代器,然后在需要访问它们的值时取消对它们的引用,例如:

auto size = newList.size();
if (size > 1)
{
    --size;
    do
    {
        check = 0, i = 0;
        auto it = newList.begin();

        while (i < size)
        {
            auto first = it;
            auto second = ++it;

            if (comp_id(*first, *second))
            {
                auto temp = *second;
                *second = *first;
                *first = temp;
                check = 1;
            }

            ++i;
        }
    }
    while (check == 1);
}

second=*++it;
这里你可能需要:
second=*(it+1);
确认你的老师有幽默感,然后使用
std::sort
@RemyLebeau(顺便说一句,名字不错)我的教授限制我不使用排序函数,以便我们更全面地掌握共享指针和列表的具体含义。这么说,我现在明白我并不是在编辑列表,我现在的问题是我如何才能准确地进行编辑。@NicholasProvencal只需先更改你的
second
将变量放入迭代器,然后在将其值传递给
comp_id()时取消对它们的引用
,或者交换它们的值,所以我需要取消对每个指针的引用,以便让该方法实际编辑列表。我所做的只是将周围的指针交换到指针,对吗?@NicholasProvencal类似的东西。在您的原始代码中,
第一个
第二个
是本地的
共享的\u ptrit
,所以
first=*it
second=*++it
正在从列表中复制对象,然后您正在比较/交换副本,而不是原始副本。通过将
first
second
变量更改为迭代器,可以避免副本和直接比较/交换原件。非常好,非常感谢。这也帮助我解决了我代码其余部分的大部分问题。我在原始问题上添加了另一个问题,希望您能解决一些问题light@NicholasProvencal这不是同一个问题,你应该把它作为一个新问题发布,并附上一个。在任何情况下,onl我看到的是,
bikelist
是通过值传递的,而不是通过引用传递的,因此创建了列表的副本,但这不会影响结果,因为代码没有修改
bikelist
本身,所以通过值传递只是错过了优化。代码正在访问原始列表所包含的原始
Bike
对象指向。没有
Bike
复制品。那么您的实际问题是什么?全局范围与任何事情有什么关系?
if (newList.size() > 1)
{
    auto begin = newList.begin();
    auto end = newList.end()-1;
    do
    {
        check = 0;
        auto it = begin;

        while (it != end)
        {
            auto first = it;
            auto second = ++it;

            if (comp_id(*first, *second))
            {
                auto temp = *second;
                *second = *first;
                *first = temp;
                check = 1;
            }
        }
    }
    while (check == 1);
}