为了账号安全,请及时绑定邮箱和手机立即绑定

vector <bool>的替代方案

vector <bool>的替代方案

C++
开满天机 2019-08-08 11:04:14
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;
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

std::deque如果您不需要阵列,请使用,是的。

否则使用vector不专门的替代方法bool,例如Boost Container中的替代方法。


查看完整回答
反对 回复 2019-08-08
?
阿晨1998

TA贡献2037条经验 获得超6个赞

这是一个有趣的问题。

如果你需要一个std :: vector,如果它不是专门的,那么也许这样的东西可以适用于你的情况:

#include <vector>#include <iostream> #include <algorithm>class Bool{public:

    Bool(): m_value(){}
    Bool( bool value ) : m_value(value){}

    operator bool() const { return m_value;}

    // the following operators are to allow bool* b = &v[0]; (v is a vector here).
    bool* operator& () { return &m_value; }const bool * const operator& () const { return &m_value; }private:

    bool m_value;};int main(){
    std::vector<Bool> working_solution(10, false);


    working_solution[5] = true;
    working_solution[7] = true;


    for( int i = 0; i < working_solution.size(); ++i )
    {
        std::cout<< "Id " << i << " = " << working_solution[i] << "(" <<(working_solution[i] ? "true" : "false") << ")" <<std::endl; // i used ? : to be sure the boolean evaluation is correct
    }

    std::sort( working_solution.begin(), working_solution.end());
    std::cout<< "--- SORTED! ---" << std::endl;

    for( int i = 0; i < working_solution.size(); ++i )
    {
            bool* b = &working_solution[i]; // this works!

        std::cout<< "Id " << i << " = " << working_solution[i] << "(" << (working_solution[i] ? "true" : "false") << ")" <<std::endl; // i used ? : to be sure the boolean evaluation is correct
    }

    std::cin.get();
    return 0;}

我用VC9试过这个,看起来效果很好。Bool类的想法是通过提供相同的行为和大小(但不是相同的类型)来模拟bool类型。几乎所有的工作都是由bool操作符和默认的复制构造函数完成的。我添加了一个排序,以确保它在使用算法时作出假设。

不确定它是否适合所有情况。如果它适合您的需求,那么重写类似矢量的类就不那么重要了......


查看完整回答
反对 回复 2019-08-08
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

取决于您的需求。我也会去std::vector<unsigned char>。如果你只使用功能的一个子集,写一个包装器就可以了,否则它将成为一场噩梦。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 1036 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信