相关疑难解决方法(0)

如何在现代C++中实现经典排序算法?

std::sort算法(及其同类std::partial_sortstd::nth_element从C++标准库)是在大多数实现的更基本的排序算法复杂和混合合并,如选择排序,插入排序,快速排序,归并排序,或堆排序.

这里和姐妹网站上有很多问题,例如https://codereview.stackexchange.com/,与错误,复杂性以及这些经典排序算法的实现的其他方面有关.大多数提供的实现包括原始循环,使用索引操作和具体类型,并且在正确性和效率方面分析通常是非常重要的.

:如何使用现代C++实现上述经典排序算法?

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

备注:

  • 有关排序算法实现的进一步参考,请参阅Wikipedia,Rosetta Codehttp://www.sorting-algorithms.com/
  • 根据Sean Parent的惯例(幻灯片39),原始循环for比使用运算符的两个函数的组合更长.所以f(g(x));f(x); g(x);f(x) + g(x);不生循环,也不是在环路selection_sortinsertion_sort下方.
  • 我遵循Scott Meyers的术语来表示当前的C++ 1y已经作为C++ 14,并且将C++ 98和C++ 03都表示为C++ 98,所以不要因此而激怒我.
  • 正如@Mehrdad的评论中所建议的那样,我在答案的最后提供了四个实现作为实例:C++ 14,C++ 11,C++ 98和Boost and C++ 98.
  • 答案本身仅以C++ 14的形式呈现.在相关的地方,我表示各种语言版本不同的语法和库差异.

c++ sorting algorithm c++-faq c++14

322
推荐指数
2
解决办法
3万
查看次数

C++ 中带有 lambda 的简单自定义迭代器

假设我有一个包含 的容器int,一个对包含 的容器起作用的函数Point,并且我有一个函数,给定一些int给我Point它所代表的对应值(想象一下我已经在某个大的 中索引了场景中的所有点std::vector<Point>)。如何创建一个简单(且高效)的包装器来使用我的第一个容器而不复制其内容?

我想要输入的代码是这样的:

template<typename InputIterator>
double compute_area(InputIterator first, InputIterator beyond) {
    // Do stuff
}

template<typename InputIterator, typename OutputIterator>
void convex_hull(InputIterator first, InputIterator beyond, OutputIterator result) {
    // Do stuff
}

struct Scene {
    std::vector<Point> vertices;

    foo(const std::vector<int> &polygon) {
        // Create a simple wraper with limited amount of mumbo-jumbo
        auto functor = [](int i) -> Point& { return vertices[polygon[i]]; });
        MagicIterator polyBegin(0, functor);
        MagicIterator polyEnd(polygon.size(), functor);
        // …
Run Code Online (Sandbox Code Playgroud)

c++ lambda containers iterator

5
推荐指数
1
解决办法
4188
查看次数

mersenne twister线程对cpp是否安全

#include <random>

int f() {

    std::random_device seeder;
    std::mt19937 engine(seeder());
    std::uniform_int_distribution<int> dist(1, 6);

    return dist(engine);

}
Run Code Online (Sandbox Code Playgroud)

多个线程可以安全地调用此函数吗?功能线程安全吗?这是reduntant调用std::random_device seeder;std::mt19937 engine(seeder());每一次?

c++ multithreading mersenne-twister c++11

4
推荐指数
2
解决办法
2077
查看次数

从真值中随机选择STL向量的索引

我有一个看起来像这样的矢量:

vector<int> A = {0, 1, 1, 0, 0, 1, 0, 1};
Run Code Online (Sandbox Code Playgroud)

我想从非零值中选择一个随机索引A.使用这个例子A,我想从数组中随机选择一个元素{1,2,5,7}.

目前我通过创建另一个数组来做到这一点

vector<int> b;
for(int i=0;i<A.size();i++)
    if(A[i]) 
        b.push_back(i);
Run Code Online (Sandbox Code Playgroud)

一旦b创建,我使用这个答案找到索引:

从容器中获取随机元素

有没有更像STL(或C++ 11)的方法,也许是一个不创建中间数组的方法?在这个例子A中很小,但在我的生产代码中,这个选择过程是在内循环中,A是非静态的,数千个元素是长的.

c++ arrays random stl c++11

1
推荐指数
1
解决办法
1344
查看次数

STL容器选择和删除随机项目?

我正在实现的算法具有以下结构:

while C is not empty
  select a random entry e from C
  if some condition on e
    append some new entries to C (I don't care where)
  else
    remove e from C
Run Code Online (Sandbox Code Playgroud)

重要的是循环 e 的每次迭代都是随机选择的(具有统一的概率)。

理想情况下selectappendremove步骤都是 O(1)。

如果正确地明白,使用std::listappendremove步骤将是O(1),但随机选择将是O(N)(例如,使用std::advance如在此解决方案)。

And std::deque and std::vector seem to have complementary O(1) and O(n) operations.

I'm guessing that std::set will introduce some O(log n) complexity.

Is there any …

c++ stl stdlist stdvector stddeque

1
推荐指数
1
解决办法
158
查看次数

C++:如何从数组生成随机数

我是一个在猜谜游戏中存储5个输入(int)的数组.

我想要做的是从该数组生成一个随机数(从存储的五个数中选择一个),任何人都可以帮助我吗?

我很喜欢rand-fuction但只能在一个范围内选择一个随机数,而不是在5个输入之间......

c++ arrays random

0
推荐指数
2
解决办法
6451
查看次数