gpt4 book ai didi

c++ - 如何将 vector 归零?

转载 作者:IT老高 更新时间:2023-10-28 13:02:08 37 4
gpt4 key购买 nike

我有一个 vector<bool>我想把它归零。我需要尺寸保持不变。

通常的方法是遍历所有元素并重置它们。但是,vector<bool>specially optimized容器,根据实现,每个元素可能只存储一位。有没有办法利用这一点来有效地清除整个事情?

bitset ,固定长度的变体,具有 set功能。是否 vector<bool>有类似的吗?

最佳答案

到目前为止发布的答案中似乎有很多猜测,但事实很少,所以也许值得做一些测试。

#include <vector>
#include <iostream>
#include <time.h>

int seed(std::vector<bool> &b) {
srand(1);
for (int i = 0; i < b.size(); i++)
b[i] = ((rand() & 1) != 0);
int count = 0;
for (int i = 0; i < b.size(); i++)
if (b[i])
++count;
return count;
}

int main() {
std::vector<bool> bools(1024 * 1024 * 32);

int count1= seed(bools);
clock_t start = clock();
bools.assign(bools.size(), false);
double using_assign = double(clock() - start) / CLOCKS_PER_SEC;

int count2 = seed(bools);
start = clock();
for (int i = 0; i < bools.size(); i++)
bools[i] = false;
double using_loop = double(clock() - start) / CLOCKS_PER_SEC;

int count3 = seed(bools);
start = clock();
size_t size = bools.size();
bools.clear();
bools.resize(size);
double using_clear = double(clock() - start) / CLOCKS_PER_SEC;

int count4 = seed(bools);
start = clock();
std::fill(bools.begin(), bools.end(), false);
double using_fill = double(clock() - start) / CLOCKS_PER_SEC;


std::cout << "Time using assign: " << using_assign << "\n";
std::cout << "Time using loop: " << using_loop << "\n";
std::cout << "Time using clear: " << using_clear << "\n";
std::cout << "Time using fill: " << using_fill << "\n";
std::cout << "Ignore: " << count1 << "\t" << count2 << "\t" << count3 << "\t" << count4 << "\n";
}

所以这会创建一个 vector ,在其中设置一些随机选择的位,对它们进行计数,然后清除它们(并重复)。设置/计数/打印是为了确保即使进行了积极的优化,编译器也不能/不会优化我们的代码来清除 vector 。

至少可以说,我发现结果很有趣。首先是 VC++ 的结果:

Time using assign: 0.141
Time using loop: 0.068
Time using clear: 0.141
Time using fill: 0.087
Ignore: 16777216 16777216 16777216 16777216

因此,对于 VC++,最快的方法是您最初可能认为最幼稚的方法——分配给每个单独项目的循环。使用 g++,结果只是 tad 不同:

Time using assign: 0.002
Time using loop: 0.08
Time using clear: 0.002
Time using fill: 0.001
Ignore: 16777216 16777216 16777216 16777216

在这里,循环是(到目前为止)最慢的方法(并且其他方法基本上是并列的——1 毫秒的速度差异实际上是不可重复的)。

不管怎样,尽管这部分测试显示为使用 g++ 快得多,但总体时间彼此相差不到 1%(VC++ 为 4.944 秒,VC++ 为 4.915 秒) g++)。

关于c++ - 如何将 vector <bool>归零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19562667/

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