5

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

在我的程序的旧版本中,我通过以 C 风格定义数组来做到这一点。即,拥有一个私有元素bool* list,然后在构造函数中分配内存(并在析构函数中释放它)。当时的方法很简单:

bool* MyClass::getList() {
    return list;
}

现在,我决定重写代码并使用std::vector<bool>而不是经典数组。问题是我也将上述方法修改为:

bool* MyClass::getList() {
    return &(list[0]);
}

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

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

谁能帮我解决这个问题并告诉我该怎么办?

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

谢谢,

4

4 回答 4

7

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

回到您的问题,您不能真正将位集解释为布尔数组。因此,有两种可能的方法来解决这个问题:

  1. 替换std::vector<bool>为可以为您提供正确行为的替代方案之一。
  2. std::vector<bool>需要时手动转换为 C 数组。例如,您可以使用size()预分配内存,然后遍历向量并填充我们的数组。

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

于 2013-08-15T12:52:46.367 回答
3
bool* MyClass::getList() {
    return &(list[0]);
}

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

于 2013-08-15T12:49:45.927 回答
0

试试 string.copy():

bool array[100];
std::vector<bool>;
std::copy(vector.begin(), vector.end(), array);
于 2013-08-15T13:27:08.610 回答
0

std::vector<bool>使用内部模型,其中每个布尔值都存储为单个位。这意味着它不是您想要的内部纯 C 数组,并且您不能毫不费力地将其转换为一个。

替换std::vector<bool>std::deque<bool>并且不使用双端队列部分,这将给出预期的行为。

另一种解决方案是使用 astd::vector<char>并将值视为布尔值。只要您在访问它时正确转换值,这将给出预期的行为。

于 2013-08-15T13:41:32.900 回答