vector <bool>的替代方法
作为(希望),我们都知道, vector<bool>
完全破坏,不能被视为交stream数组。 什么是获得这个function的最好方法? 到目前为止,我所想到的想法是:
- 或者使用一个
vector<char>
- 使用包装类,并有
vector<bool_wrapper>
你们如何处理这个问题? 我需要c_array()function。
作为一个侧面的问题,如果我不需要c_array()方法,如果我需要随机访问,解决这个问题的最好方法是什么? 我应该使用一个deque或其他东西?
编辑:
- 我确实需要dynamic的大小。
- 对于那些不知道的人来说,
vector<bool>
是专用的,所以每个bool需要1位。 因此你不能把它转换成一个c样式的数组。 - 我想“包装”是一个误用。 我在想这样的事情:
当然,然后我必须读取到my_bool由于可能的alignment问题:(
struct my_bool { bool the_bool; }; vector<my_bool> haha_i_tricked_you;
是的,如果你不需要数组,那么使用std::deque
。
否则,使用另一个不专门用于bool
vector
,比如Boost容器中的那个。
这是一个有趣的问题。
如果你需要的东西是一个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类的思想是通过提供相同的行为和大小(但不是相同的types)来模拟布尔types。 几乎所有的工作都是由bool操作符和默认的拷贝构造函数完成的。 我添加了一个sorting,以确保它使用algorithm时的假设反应。
不知道它会适合所有的情况。 如果它适合你的需求,那么比重写一个类似vector的课程要less得多。
取决于你的需求。 我会去std::vector<unsigned char>
。 如果只使用function的一个子集,写一个包装就可以了,否则它将成为一场噩梦。
你们如何处理这个问题? 我需要c_array()function。
boost::container::vector<bool>
:
vector < bool >特化已经相当成问题了,并且已经有几次不成功的尝试将其从标准中去除或者移除。
Boost.Container
没有实现它,因为有一个优越的Boost.DynamicBitset解决scheme。…
所以boost :: container :: vector :: iterator返回实际的bool引用,并作为一个完全兼容的容器。 如果您需要boost :: container :: vector < bool >function的内存优化版本,请使用Boost.DynamicBitset 。
这个问题已经在comp.lang.c ++中讨论过了。( http://groups.google.ru/group/comp.lang.c++.moderated/browse_thread/thread/b8d6dd59dfb295c0/e23e0f606d64550a )
提出解决scheme
- 你自己的分配器(基于std :: allocator)和自己的向量专业化;
- 使用std :: deque(早在一本书中推荐的S. Mayers) – 但这不符合你的要求;
- 使POD布尔包装;
- 使用与bool相同大小的东西(char / int / etc)而不是bool;
还早,我看到了标准的犯罪提议 – 引入macros(像STD_VECTOR_BOOL_SPECIAL),以消除这种专业化 – 但这个build议没有在stl实现实施,并没有被批准。
看来你的问题没有办法做到这一点很好..也许在C ++ 0x
考虑使用一个向量<int>。 一旦你通过编译和types检查,bool和int都只是机器字(编辑:显然这并非总是如此,但在许多PC架构上将是真实的)。 在那些你不需要警告的情况下进行转换的情况下,使用“bool foo = !! bar”,它将zero转换为false,非零转换为true。
一个vector <char>或类似的将会占用更less的空间,但是在某些情况下,它也有可能(非常小)的速度,因为字符小于机器字的大小。 我相信这是bools使用ints而不是chars实现的主要原因。
如果你真的想干净的语义,我也喜欢build立你自己的布尔类的build议 – 看起来像一个布尔,就像一个布尔,但愚弄模板专业化。
另外,欢迎来自希望从C ++标准中删除的vector <bool> specialization的人(用bit_vectorreplace它)的俱乐部。 这是所有的酷儿童挂在哪里:)。
最简单的答案是使用vector<struct sb>
其中sb
是struct {boolean b};
。 然后你可以说push_back({true})
。 看起来不错。