慎用std::vector<bool>,可用boost::dynamic_bitset替代

#include <vector>
#include <iostream>
using namespace std;
int main()
{
	auto f = [](auto& vec) {
		auto d = vec[0];
		d = true;
		for(auto i : vec)
			cout << i << " ";
		cout << "\n";
	};
	vector<bool> bools{ false, true, false, true, false };
	vector<int> ints{0,1,0,1,0};
	f(ints);
	f(bools);
	return 0;
}

程序输出:
0 1 0 1 0
1 1 0 1 0

使用实参ints调用lambda表达式f,第一个元素没有被修改,使用实参ints调用lambda表达式f,第一个元素被修改。原因是std::vector<bool>::reference并不是bool类型引用,而是指向一个代理类。当操作符[]配合auto使用时,出现和其他容器不同的非标准行为。

也正因为代理类,使得std::vector<bool>还存在其他缺点,但我感觉相比代码片段中的问题,这些缺点并不严重。

补充一个std::vector<bool>非标准行为示例

#include <stdio.h>
#include <vector>
int main()
{
    std::vector<bool> v{false};
    v[0] |= false;
    return 0;
}

编译报错,有两种解决方法

方法一

#include <stdio.h>
#include <vector>
int main()
{
    std::vector<bool> v{false};
    v[0] = v[0] | false;
    return 0;
}

方法二

#include <stdio.h>
#include <vector>
using namespace std;

std::vector<bool>::reference operator|= (std::vector<bool>::reference a, const bool& b){
    a = a | b;
    return a;
}

int main()
{
    vector<bool> a{false};
    bool b = false;
    bool c = true;
    a[0] |= b |= c;
    printf("b:%d\n", bool(a[0]));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值