C++ 如何使运算符[]返回对无符号整数中单个位的引用?
我正在做一个C++ 如何使运算符[]返回对无符号整数中单个位的引用?,c++,vector,reference,bit-manipulation,operator-keyword,C++,Vector,Reference,Bit Manipulation,Operator Keyword,我正在做一个向量实现。我保存一个无符号整数,并使用逐位运算得到一个true和false向量。我的问题是,;我可以通过运算符[]访问单个位,但如何获取对此类位的引用以便写入 Vector<bool> v(5, true); v[3] = false; 向量v(5,真); v[3]=假; 在某个地方,我听说你不应该引用或指向单个位。用于检索位值的代码摘要: ... unsigned int arr; // Store bits as unsigned int unsign
向量
实现。我保存一个无符号整数,并使用逐位运算得到一个true和false向量。我的问题是,;我可以通过运算符[]访问单个位,但如何获取对此类位的引用以便写入
Vector<bool> v(5, true);
v[3] = false;
向量v(5,真);
v[3]=假;
在某个地方,我听说你不应该引用或指向单个位。用于检索位值的代码摘要:
...
unsigned int arr; // Store bits as unsigned int
unsigned int size_vec; // The size of "bool vector"
...
bool& Vector<bool>::operator[](unsigned int i) {
if (i>=vec_size || i<0) {
throw out_of_range("Vector<bool>::operator[]");
}
int index = 1 << (i-1);
bool n = false;
if (index & arr) {
n=true;
}
return n;
};
。。。
无符号整数arr;//将位存储为无符号整数
无符号整数大小_vec;//“布尔向量”的大小
...
布尔&向量::运算符[](无符号整数i){
如果(i>=vec_size | | i,则需要使用适当的运算符重载定义代理对象,使其行为类似于bool&
,但处理单个位。这就是std::vector
所做的
大概是这样的:
struct Bit
{
public:
typedef unsigned char byte;
Bit(byte& _byte, byte _bit)
: m_byte(_byte), m_mask(1u << _bit)
{}
operator bool() const
{
return m_byte & m_mask;
}
Bit& operator=(bool x)
{
m_byte = x ? m_byte | m_mask : m_byte & ~m_mask;
return *this;
}
private:
byte& m_byte;
const byte m_mask;
};
struct位
{
公众:
typedef无符号字符字节;
位(字节和字节,字节位)
:m_字节(_字节)、m_掩码(1u您不能引用单个位。只能引用变量
您可以做的事情是创建一个代理类,该类公开对bool
的引用,并维护对基整数的内部引用以及必要的位篡改机制;然后创建[]
-运算符返回这样一个代理对象。您不能通过返回对bool的引用来实现。您需要创建并返回一个代理对象,并重载其赋值运算符,例如
struct bit_access_proxy {
bit_access_proxy(int& carrier, int bit) { ... }
operator bool() const {
// return the value of the bit
}
bit_access_proxy& operator=(bool new_bit) {
// set the value of the bit
}
};
bit_access_proxy Vector<bool>::operator[](int i) { ... }
struct bit\u access\u proxy{
位访问代理(int&carrier,int位){…}
运算符bool()常量{
//返回位的值
}
位访问代理和运算符=(布尔新位){
//设置位的值
}
};
位访问代理向量::运算符[](int i){…}
你不能
您最好返回一个代理对象
起点:
struct bit {
bit(Vector<bool>* vec, size_t pos);
bit& operator=(const bool& b);
operator bool();
Vector<bool>* vec;
size_t pos;
};
bit Vector<bool>::operator[](size_t pos) {
return bit(this, pos);
};
struct位{
位(向量*vec,大小\u t位置);
位和运算符=(常量布尔和b);
运算符bool();
向量*vec;
尺寸和位置;
};
位向量::运算符[](大小\u t位置){
返回位(此,pos);
};
天哪不,我们不需要另一个向量
实现——一个就足够了!不幸的是,给我任务的人不同意……冰箱正在发生什么——一百万个问题似乎都是合理的,一有明智的建议,突然,“哦,我不允许XYZ因为ABC的原因,但是我觉得不告诉你这件事更有趣。”吸血鬼!“安德鲁。巴伯:我的观点是,许多新的海报不诚实,而且是坦率的。所以人们会努力思考,并试图提出聪明的C++解决方案,但他们只能说:”哦,我的教授不想去STL。“或者是一些胡说八道。C++和教育编码体操有很大的区别,人们应该这么说。”USER 1067 171:“真正的”答案是“不要这样做”,你说“不,我不能做这件事”:-)在任何情况下,标记都是迄今为止您必须了解和使用的最重要的标记。其次,查看std::bitset
了解一些想法。如果我然后键入:int I=v[3];?这对代理无效?什么是运算符bool()?@user1067171:v[3]
将返回一个位访问\u代理
int i=…
将使用操作符bool()
将代理转换为bool
并将其分配给int
。谢谢。我明天会尝试,因为有时我们都需要一些睡眠;)