猿问

vector <bool>的替代方案

vector <bool>的替代方案

正如(希望)我们都知道的那样,vector<bool>完全被打破并且不能被视为C数组。获得此功能的最佳方法是什么?到目前为止,我所想到的想法是:

  • 使用vector<char>替代,或

  • 使用包装类并拥有 vector<bool_wrapper>

你们怎么处理这个问题?我需要这个c_array()功能。

作为一个附带问题,如果我不需要该c_array()方法,如果我需要随机访问,那么解决此问题的最佳方法是什么?我应该使用双端队列还是别的什么?

编辑:

  • 我确实需要动态调整大小。

  • 对于那些不知道的人,vector<bool>是专门的,每个人bool需要1位。因此,您无法将其转换为C风格的数组。

  • 我猜“包装”有点用词不当。我在想这样的事情:

当然,然后我必须阅读my_bool由于可能的对齐问题:(

struct my_bool{
    bool the_bool;};vector<my_bool> haha_i_tricked_you;


开满天机
浏览 1037回答 3
3回答

郎朗坤

std::deque如果您不需要阵列,请使用,是的。否则使用vector不专门的替代方法bool,例如Boost Container中的替代方法。

阿晨1998

这是一个有趣的问题。如果你需要一个std :: vector,如果它不是专门的,那么也许这样的东西可以适用于你的情况:#include&nbsp;<vector>#include&nbsp;<iostream>&nbsp;#include&nbsp;<algorithm>class&nbsp;Bool{public: &nbsp;&nbsp;&nbsp;&nbsp;Bool():&nbsp;m_value(){} &nbsp;&nbsp;&nbsp;&nbsp;Bool(&nbsp;bool&nbsp;value&nbsp;)&nbsp;:&nbsp;m_value(value){} &nbsp;&nbsp;&nbsp;&nbsp;operator&nbsp;bool()&nbsp;const&nbsp;{&nbsp;return&nbsp;m_value;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;following&nbsp;operators&nbsp;are&nbsp;to&nbsp;allow&nbsp;bool*&nbsp;b&nbsp;=&nbsp;&v[0];&nbsp;(v&nbsp;is&nbsp;a&nbsp;vector&nbsp;here). &nbsp;&nbsp;&nbsp;&nbsp;bool*&nbsp;operator&&nbsp;()&nbsp;{&nbsp;return&nbsp;&m_value;&nbsp;}const&nbsp;bool&nbsp;*&nbsp;const&nbsp;operator&&nbsp;()&nbsp;const&nbsp;{&nbsp;return&nbsp;&m_value;&nbsp;}private: &nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;m_value;};int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<Bool>&nbsp;working_solution(10,&nbsp;false); &nbsp;&nbsp;&nbsp;&nbsp;working_solution[5]&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;working_solution[7]&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;working_solution.size();&nbsp;++i&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout<<&nbsp;"Id&nbsp;"&nbsp;<<&nbsp;i&nbsp;<<&nbsp;"&nbsp;=&nbsp;"&nbsp;<<&nbsp;working_solution[i]&nbsp;<<&nbsp;"("&nbsp;<<(working_solution[i]&nbsp;?&nbsp;"true"&nbsp;:&nbsp;"false")&nbsp;<<&nbsp;")"&nbsp;<<std::endl;&nbsp;//&nbsp;i&nbsp;used&nbsp;?&nbsp;:&nbsp;to&nbsp;be&nbsp;sure&nbsp;the&nbsp;boolean&nbsp;evaluation&nbsp;is&nbsp;correct &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;std::sort(&nbsp;working_solution.begin(),&nbsp;working_solution.end()); &nbsp;&nbsp;&nbsp;&nbsp;std::cout<<&nbsp;"---&nbsp;SORTED!&nbsp;---"&nbsp;<<&nbsp;std::endl; &nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;working_solution.size();&nbsp;++i&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool*&nbsp;b&nbsp;=&nbsp;&working_solution[i];&nbsp;//&nbsp;this&nbsp;works! &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout<<&nbsp;"Id&nbsp;"&nbsp;<<&nbsp;i&nbsp;<<&nbsp;"&nbsp;=&nbsp;"&nbsp;<<&nbsp;working_solution[i]&nbsp;<<&nbsp;"("&nbsp;<<&nbsp;(working_solution[i]&nbsp;?&nbsp;"true"&nbsp;:&nbsp;"false")&nbsp;<<&nbsp;")"&nbsp;<<std::endl;&nbsp;//&nbsp;i&nbsp;used&nbsp;?&nbsp;:&nbsp;to&nbsp;be&nbsp;sure&nbsp;the&nbsp;boolean&nbsp;evaluation&nbsp;is&nbsp;correct &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;std::cin.get(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}我用VC9试过这个,看起来效果很好。Bool类的想法是通过提供相同的行为和大小(但不是相同的类型)来模拟bool类型。几乎所有的工作都是由bool操作符和默认的复制构造函数完成的。我添加了一个排序,以确保它在使用算法时作出假设。不确定它是否适合所有情况。如果它适合您的需求,那么重写类似矢量的类就不那么重要了......

ABOUTYOU

取决于您的需求。我也会去std::vector<unsigned char>。如果你只使用功能的一个子集,写一个包装器就可以了,否则它将成为一场噩梦。
随时随地看视频慕课网APP
我要回答