正如(希望)我们都知道的那样,vector<bool>完全被打破,不能被视为交流阵列.获得此功能的最佳方法是什么?到目前为止,我所想到的想法是:
vector<char>替代,或vector<bool_wrapper>你们怎么处理这个问题?我需要c_array()功能.
作为一个附带问题,如果我不需要c_array()方法,如果我需要随机访问,解决此问题的最佳方法是什么?我应该使用双端队列还是别的什么?
编辑:
c_array()是专门的,所以每个bool需要1位.因此,您无法将其转换为C风格的数组.当然,由于可能的对齐问题,我必须读入my_bool :(
struct my_bool
{
bool the_bool;
};
vector<my_bool> haha_i_tricked_you;
Run Code Online (Sandbox Code Playgroud) #include <vector>
struct A
{
void foo(){}
};
template< typename T >
void callIfToggled( bool v1, bool &v2, T & t )
{
if ( v1 != v2 )
{
v2 = v1;
t.foo();
}
}
int main()
{
std::vector< bool > v= { false, true, false };
const bool f = false;
A a;
callIfToggled( f, v[0], a );
callIfToggled( f, v[1], a );
callIfToggled( f, v[2], a );
}
Run Code Online (Sandbox Code Playgroud)
上面示例的编译会产生下一个错误:
dk2.cpp: In function 'int main()':
dk2.cpp:29:28: error: no …Run Code Online (Sandbox Code Playgroud) 它是众所周知的是std::vector<bool>不符合标准的容器的需求,主要是因为打包表示防止T* x = &v[i]从一个指针返回一个布尔值.
我的问题是:当reference_proxy重载address-of operator&以返回pointer_proxy 时,这可以得到补救/缓解吗?
在大多数实现中,指针代理可以包含与reference_proxy相同的数据,即指向打包数据的指针和用于隔离指向的块内的特定位的掩码.然后,pointer_proxy的间接将产生reference_proxy.基本上两个代理都是"胖"指针,然而,与基于磁盘的代理容器相比,这些指针仍然相当轻.
而不是T* x = &v[0]一个会然后做auto x = &v[0],并使用x像if(*x)没有问题.我也希望能够写作for(auto b: v) { /* ... */ }
问题:这种多代理方法是否适用于STL的算法?或者某些算法真的依赖于x需要真实的需求bool*?或者是否有太多连续的用户定义转换需要阻止它工作?在尝试完全完成上述实施草图之前,我想知道任何这样的障碍物.
更新(基于@HowardHinnant的回答和关于comp.std.c ++的古老讨论)
你可以在很大程度上模仿内置类型:对于任何给定的类型T,一对代理(例如reference_proxy和iterator_proxy)可以在reference_proxy :: operator&()和iterator_proxy :: operator*的意义上相互一致. ()是彼此相反的.
但是,在某些时候,需要将代理对象映射回来以表现为T*或T&.对于迭代器代理,可以重载operator - >()并访问模板T的接口,而无需重新实现所有功能.但是,对于参考代理,您需要重载operator.(),这在当前C++中是不允许的(尽管Sebastian Redl在BoostCon 2013上提出了这样的提议).您可以像引用代理中的.get()成员一样进行冗长的解决方法,或者在引用中实现所有T的接口(这是对vector :: bit_reference所做的),但这会丢失内置语法或引入用户定义的转换,这些转换没有用于类型转换的内置语义(每个参数最多只能有一个用户定义的转换).