相关疑难解决方法(0)

为什么vector <bool> :: reference不会返回对bool的引用?

#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)

c++ compiler-errors g++

56
推荐指数
5
解决办法
1万
查看次数

是否可以使用C++中的std :: vector <bool>对象,还是应该使用替代?

我正在使用用户定义的位数(我持有三维位数组,因此大小立方增加 - 假设不小于512位),并且需要单独翻转它们.现在,只是在计算机上,我正在使用该bool类型,因为内存不是问题.我计划将来将代码移到微控制器上,因此处理能力和内存要求可能是一个问题.不过现在,我只想要速度.

然后我std::bitsetC++ STL中找到了该对象,但我无法在运行时定义bitset的大小.然后我发现std::vector<byte>有一个特殊的初始化器将它们存储为位(而不是整个字节,或4个字节),但随后在维基百科中找到了这一部分:

标准库定义了vector模板的特化bool.此专业化的描述表明实现应该打包元素,以便每个bool只使用 一位内存.这被普遍认为是一个错误.[...] C++标准委员会和图书馆工作组之间存在普遍共识,vector<bool>应该弃用并随后从标准库中删除,而功能将以不同的名称重新引入.

现在,你可能会看到我想要使用一个vector<bool>对象,但在阅读之后,我正在考虑使用其他东西.唯一的问题是我不知道使用什么.我很好奇为什么他们说应该重新引入功能(尽管名称不同).

所以,我的问题是,vector<bool>对象的使用是否可以接受(因为它们是STL的一部分)?它们是C++标准的一部分吗?

如果他们的使用是不可接受的,是否有一个可接受的替代解决方案(我自己定义一个特殊的容器)?我自己也有一些想法,但我很好奇是否有人有更好的解决方案.另外,我想避免使用大型库(同样,我希望最终将此代码移植到微控制器).

c++ stl boolean vector bitset

26
推荐指数
4
解决办法
9801
查看次数

std :: vector &lt;bool&gt;上的运算符| =

以下代码无法编译

#include <vector>
int main()
{
  std::vector<bool> enable(10);
  enable[0] |= true;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出错误

no match for ‘operator|=’ (operand types are ‘std::vector<bool>::reference {aka std::_Bit_reference}’ and ‘bool’)
Run Code Online (Sandbox Code Playgroud)

在我的实际代码中,我有一个位域,其中包含我想要|=的函数结果值。

有简单的方法可以表达相同的想法,但是有没有充分的理由使这种运算符不可用?

c++ boolean-operations bit-fields

1
推荐指数
1
解决办法
1449
查看次数