我可以在 C++ 中获得非专用 vector<bool> 类型吗?
Can I get an unspecialized vector<bool> type in C++?
A vector<bool>
专门用于减少 space 消耗(每个元素 1 位),但访问速度比 vector<char>
慢。有时我出于性能原因使用 vector<char>
,但如果我将 char
转换为 bool
,我的编译器 (Visual C++) 可能会生成一个 C4800 警告,但我没有这样做不喜欢。
此外,如果我将 vector<char>
视为未专门化的 vector<bool>
,我认为它在语义上是错误的。那么,我可以在 C++ 中获得一个真正的非专用 vector<bool>
类型吗?
不,你不能得到一个非专业化的std::vector<bool>
。
正如您已经发现的,vector<char>
是您最好的选择。要绕过警告,只需使用 bool 表达式:
bool b1 = v[0] != 0;
bool b2 = !!v[0];
或者,创建自定义布尔值 class:
class Bool
{
public:
Bool(){}
Bool(const bool& val) : val_(val) {}
inline Bool& operator=(const bool& val) { val_ = val; }
operator bool() const { return val_; }
private:
bool val_;
};
...
vector<Bool> bvec;
bvec.push_back(false);
bvec.push_back(true);
bool bf = bvec[0];
bool bt = bvec[1];
A vector<bool>
专门用于减少 space 消耗(每个元素 1 位),但访问速度比 vector<char>
慢。有时我出于性能原因使用 vector<char>
,但如果我将 char
转换为 bool
,我的编译器 (Visual C++) 可能会生成一个 C4800 警告,但我没有这样做不喜欢。
此外,如果我将 vector<char>
视为未专门化的 vector<bool>
,我认为它在语义上是错误的。那么,我可以在 C++ 中获得一个真正的非专用 vector<bool>
类型吗?
不,你不能得到一个非专业化的std::vector<bool>
。
vector<char>
是您最好的选择。要绕过警告,只需使用 bool 表达式:
bool b1 = v[0] != 0;
bool b2 = !!v[0];
或者,创建自定义布尔值 class:
class Bool
{
public:
Bool(){}
Bool(const bool& val) : val_(val) {}
inline Bool& operator=(const bool& val) { val_ = val; }
operator bool() const { return val_; }
private:
bool val_;
};
...
vector<Bool> bvec;
bvec.push_back(false);
bvec.push_back(true);
bool bf = bvec[0];
bool bt = bvec[1];