gpt4 book ai didi

c++ - 使用 std::sort 计算交换

转载 作者:行者123 更新时间:2023-12-03 07:02:06 36 4
gpt4 key购买 nike

是否有一种可移植的、开销最小的方法来计算在 C++ 中的 std::sort 期间执行的交换操作的数量?我想这样做是因为我需要计算用于对列表进行排序的排列的符号,我想知道是否有一种方法可以为此重用 std::sort 而不是编写我的自己的排序功能。

最佳答案

我试图通过制作一个包装器/自定义类型来重载 std::swap 来真正快速地回答...然后遇到一个事实,即对于超小 vector 交换不被调用...点击评论中的链接所以尝试 2 为 move_constructor 添加了一个计数器。

我不能说这是一个最小开销的解决方案,如果您需要确切数量的交换操作,您最好编写自己的排序函数。

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

struct A{
static int swap_count;
static int move_constructor_count;
int a;
A(int _a): a(_a) {}
bool operator<(const A& other) const{
return this->a < other.a;
}
A(const A&other): a(other.a) {move_constructor_count++;}
};
int A::swap_count = 0;
int A::move_constructor_count = 0;

namespace std{
template<>
void swap(A& lhs, A& rhs) {
A::swap_count++;
std::swap(lhs.a, rhs.a);
}
}


int main() {
std::default_random_engine gen;
std::uniform_int_distribution<int> dis(1,100);

std::vector<A> test;
for(int _=0;_<10;_++) test.emplace_back(dis(gen)); //fill a vector randomly

A::move_constructor_count = 0; // emplace calls move constructor
std::sort(test.begin(), test.end());
std::cout << "after sort1: swap count:" << A::swap_count << " move count: " << A::move_constructor_count << std::endl;


// arbitrary way to fill a large test vector
std::vector<A> test2;
for(int _=0;_<1000;_++) test2.emplace_back(dis(gen)); //fill a vector randomly

A::move_constructor_count = 0;
A::swap_count = 0;
std::sort(test2.begin(), test2.end());
std::cout << "after sort2: swap count:" << A::swap_count << " move count: " << A::move_constructor_count << std::endl;

}

给我

after sort1: swap count:0 move count: 9
after sort2: swap count:1806 move count: 999

关于c++ - 使用 std::sort 计算交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64455039/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com