gpt4 book ai didi

c++ - 修改部分数组的最快方法

转载 作者:行者123 更新时间:2023-11-27 23:21:43 25 4
gpt4 key购买 nike

我想对一个 bool 数组的连续元素 block 执行 not 操作,然后读回完整的数组。我正在使用以下代码来执行操作。

bool arr[100000]={0};
cin>>x>>y;
for(i=x; i<=y; i++)
arr[i]=!arr[i];

//Some other operations on the array

for(i=0; i<=100000; i++)
arr+=arr[i];

这工作正常,但我正在尝试提高程序的速度。有没有更好的方法来执行相同的操作?

最佳答案

考虑使用 bitset。比较性能 - 也许它会更好。

std::bitset<100000> arr;
cin>>x>>y;
for(i=x; i<=y; i++)
arr.flip(i);

//Some other operations on the array
unsigned int carr = arr.count();

为了更优化(请测量并且不要相信)您可以使用您自己的 bitset<> 版本,这不是经过测试的代码:

const size_t arr_bitlen = 100000;
typedef unsigned int arr_type;
const size_t arr_type_size = sizeof(arr_type);
const size_T arr_len = (arr_bitlen + arr_type_size - 1) / arr_type_size;
arr_type arr[arr_len] = { 0 };
cin>>x>>y;
unsigned int x_addr = x / arr_type_size;
unsigned int y_addr = y / arr_type_size;
unsigned int x_bit = x % arr_type_size;
unsigned int y_bit = y % arr_type_size;

if (0 == x_bit)
for (i=x_addr; i<=y_addr; i++)
arr[i] = ~arr[i]; // revert all bits (bools)
else {
// deal with first element in range ( ....xxxx - change only x-s
arr_type x_mask = ((1 << x_bit) - 1) << (arr_type_len - x_bit);
arr[x_addr] ^= x_mask;
for (i = x_bit + 1; i < arr_type_size; ++i)
arr[i] = ~arr[i]; // revert all bits (bools)
}
if (y_bit > 0) // try to invert 0..y_bit in arr[y_addr + 1] by yourself

//Some other operations on the array
see implementation of std::bitset<N>::count() - it is very clever - just copy it

关于c++ - 修改部分数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432084/

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