c++标准库中的std::sort算法(及其兄弟std::partial_sort和std::nth_element)在大多数实现中是更基本排序算法的复杂混合组合,例如选择排序、插入排序、快速排序、归并排序或堆排序。

这里和姐妹网站(如https://codereview.stackexchange.com/)上有许多问题与这些经典排序算法实现的错误、复杂性和其他方面有关。大多数提供的实现都由原始循环组成,使用索引操作和具体类型,并且在正确性和效率方面分析起来通常不是简单的。

问:如何使用现代c++实现上面提到的经典排序算法?

没有原始循环,而是结合了<algorithm>中的标准库算法构建块 迭代器接口和使用模板代替索引操作和具体类型 c++ 14风格,包括完整的标准库,以及诸如auto、模板别名、透明比较器和多态lambdas等语法降噪器。

注:

for further references on implementations of sorting algorithms see Wikipedia, Rosetta Code or http://www.sorting-algorithms.com/ according to Sean Parent's conventions (slide 39), a raw loop is a for-loop longer than composition of two functions with an operator. So f(g(x)); or f(x); g(x); or f(x) + g(x); are not raw loops, and neither are the loops in selection_sort and insertion_sort below. I follow Scott Meyers's terminology to denote the current C++1y already as C++14, and to denote C++98 and C++03 both as C++98, so don't flame me for that. As suggested in the comments by @Mehrdad, I provide four implementations as a Live Example at the end of the answer: C++14, C++11, C++98 and Boost and C++98. The answer itself is presented in terms of C++14 only. Where relevant, I denote the syntactic and library differences where the various language versions differ.

我经常听到有人说,在编译C和c++程序时,我应该“总是启用编译器警告”。为什么这是必要的?我怎么做呢?

有时我也听到我应该“把警告当作错误”。我应该吗?我怎么做呢?

P0137引入了函数模板std::launder,并在关于联合、生命期和指针的部分对标准做了很多很多修改。

这篇论文要解决的问题是什么?我必须注意语言的哪些变化?我们在洗什么?

在Bash脚本中,我想从输入文件中随机挑选N行并输出到另一个文件。

如何做到这一点呢?

我开始研究c++ 11的智能指针,我没有看到std::weak_ptr有任何有用的用途。有人能告诉我什么时候std::weak_ptr是有用的/必要的吗?

我正在使用的Less编译器(OrangeBits和dotless 1.3.0.5)正在积极地进行翻译

body { width: calc(100% - 250px - 1.5em); }

into

body { width: calc(-151.5%); }

这显然不是我们所希望的。我想知道是否有一种方法向Less编译器发出信号,在编译期间基本上忽略该属性。我已经搜索了Less文档和两个编译器的文档,但我什么也找不到。

Less或Less编译器支持这一点吗?

如果不是,是否有CSS扩展器可以做到?

我听说c++的类成员函数模板不能是虚的。这是真的吗?

如果它们可以是虚拟的,那么有什么场景可以使用这样的函数呢?

在Java中给定以下enum,将Int类型转换为enum的正确方法是什么?

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}


MyEnum enumValue = (MyEnum) x; //Doesn't work???

我有需要解析的XML文档和/或需要构建XML文档并将它们写入文本(文件或内存)。既然c++标准库没有这样的库,我应该使用什么?

注意:这是一个明确的,c++ - faq风格的问题。所以,是的,它是其他东西的复制品。我没有简单地盗用那些问题,因为他们往往会问一些更具体的问题。这个问题比较一般。

最近有人建议我在代码中使用span<T>,或者在网站上看到一些使用span's的答案——应该是某种容器。但是-我在c++ 17标准库中找不到任何类似的东西。

那么,这个神秘的span<T>是什么?如果它是非标准的,为什么(或什么时候)使用它是一个好主意?