vectorbool引发的如何发现问题的思考

xiaoxiao2021-02-28  13

标题应该是vector<bool>引发的如何发现问题的思考,如果写成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去替代解决这个问题。

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

转载请注明原文地址: https://www.6miu.com/read-2603267.html

最新回复(0)