vector<bool> 引发的如何发现问题的思考

前段时间,在项目开发过程之中,自己遇到了一个奇怪的问题。使用了vector<bool>,而将vector<bool>的元素值,作为引用值去传参数的时候,报了个莫名其妙的错。当时因为在赶进度,觉得根据自己的理解,可能一时半会搞不定,就没有深纠,另外,觉得这可能会是一个好问题,就先把这个问题记下来,先不管,尝试用其他办法先把项目实现先搞定,等主要工作完成之后,再尝试回过头来安排时间收拾这个问题。问题原型是这样:大家可以自己把代码贴过去试运行。为了比对,我加了对vector<int>的调用

#include <iostream>
#include <vector>

using namespace std;

void Fun(int& is_ok) {
    is_ok = 1;
}

void FunBool(bool& is_ok) {
    is_ok = true;
}

int main(int argc, char** argv) {
    
    vector<int> v_int;
    v_int.push_back(1);
    
    Fun(v_int[0]);

    vector<bool> v_bool;
    v_bool.push_back(true);
 //报错在这个函数的调用上
    FunBool(v_bool[0]);
    return 0;
}

报错的提示:


后面去查得的原因:

是因为vector<bool>与普通的vector<T>模板的实现,不是一回事。这是一个被STL底层实现上做过特殊处理的实现,与普通的vector<Type>这种生成的容器不同。

它的底层使用的是bit来实现,而bool的存储是一个字节(8个bit),bit是一个位。所以FunBool(bool&)要求传的是一个字节,而实际上v_bool[0]返回的引用是一个bit,类型不同,所以报错。

解决办法:可以使用char去替代解决这个问题。

另外:提到在学习过程中,往往能让自己前进的是一些好的“问题”。如果在项目中,能遇到自己不懂的问题,时间紧的情况下,建议是能够不要太恋战,因为可能真要搞清楚,自己目前的理论知识未必能三两上搞明白,可以先灵活处理,大部分情况下,没有非用不可的情况,先想办法绕过问题,把问题先记录下来。等把事情搞定之后,再想办法把问题搞透,这才是一个会持续长进软件工程师应当有的修行办法。共勉之!

猜你喜欢

转载自blog.csdn.net/dreamvyps/article/details/80948747