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 回答
阿晨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操作符和默认的复制构造函数完成的。我添加了一个排序,以确保它在使用算法时作出假设。
不确定它是否适合所有情况。如果它适合您的需求,那么重写类似矢量的类就不那么重要了......
ABOUTYOU
TA贡献1812条经验 获得超5个赞
取决于您的需求。我也会去std::vector<unsigned char>
。如果你只使用功能的一个子集,写一个包装器就可以了,否则它将成为一场噩梦。
- 3 回答
- 0 关注
- 1036 浏览
添加回答
举报
0/150
提交
取消