【问题标题】:my function to sort a shared pointer list in c++ is not completing the sort我在 C++ 中对共享指针列表进行排序的函数没有完成排序
【发布时间】:2018-04-26 23:36:01
【问题描述】:

我有一个由 5 个共享指针组成的 STL std::list,这些指针指向需要按它们各自的 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);

在此代码中,comp_id() 返回 true,并在整个组织中运行,但在 list 发生时没有任何变化。我希望对为什么会发生这种情况以及如何解决它有一些看法。

附:我不允许使用list_name.sort() 方法:(

【问题讨论】:

  • second = *++it; 这里你可能需要:second = *(it+1);
  • 确认你的老师有幽默感,然后使用std::sort
  • @RemyLebeau (BTW) 我的教授限制我不使用排序功能,以便我们更全面地了解共享指针和列表的具体含义。话虽如此,我现在明白我实际上并没有编辑列表,我现在的问题是我该如何去做。
  • @NicholasProvencal 只需将您的 firstsecond 变量更改为迭代器,然后在将它们的值传递给 comp_id() 或交换它们的值时取消引用它们

标签: c++ list sorting pointers shared


【解决方案1】:

它不起作用的原因是因为您只修改了局部变量(firstsecond),它们是列表中值的副本。您根本没有修改列表的实际内容。

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

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

就此而言,i 也可以替换为迭代器:

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

【讨论】:

  • 啊,所以我需要取消引用每个指针,以便让方法实际编辑列表。我所做的只是将周围的指针交换为指针,对吗?
  • @NicholasProvencal 类似的东西。在您的原始代码中,firstsecond 是本地 shared_ptr&lt;node&gt; 对象,因为您要取消引用 it,因此 first = *itsecond = *++it 正在制作列表中对象的 副本 ,然后您正在比较/交换副本,而不是原件。通过将firstsecond 变量更改为迭代器,您可以避免副本 并直接比较/交换原件
  • 太好了,非常感谢,这也帮助我解决了其余代码的大部分问题。
  • 我在原始问题中添加了另一个问题,希望您能有所启发
  • @NicholasProvencal 这不是同一个问题,您应该使用minimal reproducible example 将其作为一个新问题发布。在任何情况下,我看到的唯一内容是 bikelist 是按值而不是按引用传递的,因此生成了列表的 copy ,但这不会影响代码的结果没有修改bikelist 本身,所以按值传递只是错过了优化。该代码正在访问原始列表指向的原始Bike 对象。没有制作Bike 副本。那么你遇到的实际问题是什么? “全局范围”与什么有什么关系?
猜你喜欢
  • 2016-07-06
  • 1970-01-01
  • 2011-02-03
  • 2013-08-05
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多