当前位置:  开发笔记 > 编程语言 > 正文

vector <bool>的替代方案

如何解决《vector<bool>的替代方案》经验,为你挑选了5个好方法。

正如(希望)我们都知道的那样,vector完全被打破,不能被视为交流阵列.获得此功能的最佳方法是什么?到目前为止,我所想到的想法是:

使用vector替代,或

使用包装类并拥有 vector

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

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

编辑:

我确实需要动态调整大小.

对于那些不知道的人来说,c_array()是专门的,所以每个bool需要1位.因此,您无法将其转换为C风格的数组.

我猜"包装"有点用词不当.我在想这样的事情:

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

struct my_bool
{
    bool the_bool;
};
vector haha_i_tricked_you;

Daniel Earwi.. 38

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

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



1> Daniel Earwi..:

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

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



2> Klaim..:

这是一个有趣的问题.

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

#include 
#include  
#include 

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 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") << ")" <

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

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


作为解决方案,我们可以添加bool*operator&(){return&m_value; 并转换为const bool*,bool&和const bool&.但无论如何 - 主要想法是正确的.
我宁愿简单地将`operator bool()const`改为`operator bool&()`.这使得它更好地反映了一个简单bool的行为,因为它支持赋值等,例如`v [0] = true;`我真的看不出这个更改的问题,所以我可以进行编辑吗?

3> David Rodríg..:

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


也许更新为:`std :: vector <uint8_t>`?

4> Evgeny Panas..:

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

boost::container::vector:

vector < bool > specialization一直存在很大的问题,并且已经有几次尝试不推荐使用或从标准中删除它.Boost.Container没有实现它,因为有一个优秀的Boost.DynamicBitset解决方案.

...

因此boost :: container :: vector :: iterator返回真正的bool引用,并作为完全兼容的容器.如果您需要内存优化版本的boost :: container :: vector < bool >功能,请使用Boost.DynamicBitset.



5> AHelps..:

考虑使用vector .一旦你通过编译和类型检查,bool和int都只是机器字(编辑:显然这并不总是正确;但在许多PC架构上都是如此).如果您想在没有警告的情况下进行转换,请使用"bool foo = !! bar",它将零转换为false,将非零转换为true.

vector 或类似的将使用更少的空间,但它也有可能在某些情况下(非常小的)速度命中,因为字符小于机器字大小.我认为,这是使用int而不是chars实现bool的主要原因.

如果你真的想要干净的语义,我也喜欢制作你自己的布尔类的建议 - 看起来像一个bool,就像一个bool,但是愚弄模板专业化.

此外,欢迎来自那些希望从C++标准中删除vector 专业化的人员(使用bit_vector替换它)的俱乐部.这是所有酷孩子们出去玩的地方:).


bool和int不一定都是机器词.在我开发的系统上,sizeof(bool)= 1和sizeof(int)= 4.对齐要求和生成的加载/存储指令相应地不同.
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有