的std::sort算法(及其同类std::partial_sort和std::nth_element从C++标准库)是在大多数实现的更基本的排序算法复杂和混合合并,如选择排序,插入排序,快速排序,归并排序,或堆排序.
这里和姐妹网站上有很多问题,例如https://codereview.stackexchange.com/,与错误,复杂性以及这些经典排序算法的实现的其他方面有关.大多数提供的实现包括原始循环,使用索引操作和具体类型,并且在正确性和效率方面分析通常是非常重要的.
问:如何使用现代C++实现上述经典排序算法?
<algorithm>auto模板别名,透明比较器和多态lambda.备注:
for比使用运算符的两个函数的组合更长.所以f(g(x));或f(x); g(x);或f(x) + g(x);不生循环,也不是在环路selection_sort和insertion_sort下方.假设我有一个包含 的容器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) #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());每一次?
我有一个看起来像这样的矢量:
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是非静态的,数千个元素是长的.
我正在实现的算法具有以下结构:
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 的每次迭代都是随机选择的(具有统一的概率)。
理想情况下select,append和remove步骤都是 O(1)。
如果正确地明白,使用std::list的append和remove步骤将是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 …
我是一个在猜谜游戏中存储5个输入(int)的数组.
我想要做的是从该数组生成一个随机数(从存储的五个数中选择一个),任何人都可以帮助我吗?
我很喜欢rand-fuction但只能在一个范围内选择一个随机数,而不是在5个输入之间......