如何将C++向量转换为C风格的数组?

kMa*_*ter 5 c++ stdvector

我有一个存储数组的类,我需要编写一个方法来返回指向该数组的指针,以便其他对象可以访问/修改它.

在我的程序的旧版本中,我通过使用C风格定义数组来实现这一点.即,拥有一个私有元素bool* list,然后在构造函数中分配内存(并在析构函数中释放它).那么方法非常简单:

bool* MyClass::getList() {
    return list;
}
Run Code Online (Sandbox Code Playgroud)

现在,我决定重写代码并使用std::vector<bool>而不是经典数组.问题是我还修改了上面的方法:

bool* MyClass::getList() {
    return &(list[0]);
}
Run Code Online (Sandbox Code Playgroud)

这似乎是将C++向量转换为C数组的标准方法.但是,我无法编译我的代码,我收到以下错误:

error: taking address of temporary [-fpermissive]
error: cannot convert ‘std::vector<bool>::reference* {aka std::_Bit_reference*}’ to ‘bool*’ in return
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题并告诉我该怎么办?

(我还读过另一个选择是使用list.data()指针,但这只适用于最新版本的C++编译器.我不确定这是不是一个好主意).

谢谢,

小智 7

你的思维过程是正确的,并且指出第一个元素就足够了.然而,std::vector<bool>它实际上不是bools 的向量,因为它被实现为一个位集.C++标准委员会和图书馆工作组之间存在普遍的共识,vector<bool>应该弃用并随后从标准库中删除,而功能将以不同的名称重新引入.但现在它仍然存在.

回到你的问题,你无法将bitset解释为一组布尔值.因此,有两种可能的方法:

  1. 更换std::vector<bool>的替代品之一,将让你在正确的行为.
  2. std::vector<bool>需要时手动转换为C数组.例如,您可以使用size()预先分配内存,然后迭代向量并填充我们的数组.

希望能帮助到你.祝好运!


Evg*_*hev 4

bool* MyClass::getList() {
    return &(list[0]);
}
Run Code Online (Sandbox Code Playgroud)

这适用于任何类型,但std::vector<bool>有特殊的实现,其中 8 个元素存储在 1 个字节中,因此似乎不可能获取指向它的原始指针。