如何通过使第一个插入位置保持不变来对列表中插入的其余元素进行排序?

时间:2020-06-03 15:07:46

标签: c++ list sorting

假设我正在尝试使用包含列表在CPP中的列表上插入随机内容

'https://ng-complete-guide-257c0.firebaseio.com/posts.json

如何,以及在哪里调用newList.sort()使除第一个插入字符(即James)之外的所有其他字符排序?

4 个答案:

答案 0 :(得分:6)

这是一个潜在的解决方案,首先删除第一个条目,然后进行排序。

auto front = newList.front();
newList.pop_front();
newList.sort();
newList.push_front(front);

这将对整个列表进行排序,但是开头(示例中的James)将重新添加到列表的开头。

答案 1 :(得分:4)

保持第一个元素位置的简单解决方案:

  • 将迭代器存储到第一个元素
  • 对列表进行排序
  • 将元素从存储的迭代器拼接回开始

如果“第一插入”不是第一个元素-毕竟元素可以插入任意位置-那么就需要更复杂的逻辑。

不幸的是,在标准库中似乎没有针对子列表的通用排序算法。

答案 2 :(得分:2)

使用自定义比较器,将James放在所有其他比较器的前面:

bool compare(const std::string& a, const std::string& b) {
    if (a == b) return false;
    else if (a == James) return true;
    else if (b == James) return false;
    else return a < b;
}

您需要注意a==b的情况才能严格执行弱排序(James < James必须返回false)。然后James在所有其他元素之前,其他所有在James之后,否则您只需比较这两个元素。

请注意,如果列表中有多个James,那么在进行比较时,它们都将排在前面,因此,它并不能完全满足您的要求。

答案 3 :(得分:-2)

 auto first = newList.front();
 newList.sort();
 cout<<first<<" ";
 for(auto it :newList)
    cout<<it<<" ";