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

时间:2013-08-15 12:43:16

标签: c++ stdvector

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

在我的程序的旧版本中,我通过使用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 ++编译器。我不确定这是不是一个好主意。)< / p>

谢谢,

4 个答案:

答案 0 :(得分:7)

你的思维方式一般是正确的,并且指出第一个元素就足够了。但是,std::vector<bool> is not really a vector of bools因为它被实现为一个位集。 C ++标准委员会和图书馆工作组之间已达成共识,vector<bool>应该被弃用并随后从标准库中删除,而功能将以不同的名称重新引入。但现在它仍然存在。

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

  1. std::vector<bool>替换为可为您提供正确行为的one of the alternatives
  2. 在需要时手动将std::vector<bool>转换为C数组。例如,您可以使用size()预先分配内存,然后迭代向量并填充我们的数组。
  3. 希望它有所帮助。祝你好运!

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

尝试string.copy():

bool array[100];
std::vector<bool>;
std::copy(vector.begin(), vector.end(), array);

答案 3 :(得分:0)

std::vector<bool>使用内部模型,其中每个bool存储为单个位。这意味着它不是你想要的内部普通C数组,你不能毫不费力地将它转换成一个。

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

另一种解决方案是使用std::vector<char>代替并将值视为bools。只要在访问时正确地转换值,这将给出预期的行为。