1

我有一个类似于Convert vector of vector to pointer of pointer问题中提到的问题。

唯一的区别是我必须使用布尔值而不是短裤。

但是如果我编译这段代码:

#include <vector>

/* C like api */
void foo(bool **psPtr, const int x, const int y);

int main()
{
  const int x = 2, y = 3;
  std::vector<std::vector<bool>> vvsVec(x, std::vector<bool>(y, 0));
  std::vector<bool *> vpsPtr(x, nullptr);

  /* point vpsPtr to the vector */
  int c = 0;
  for (auto &vsVec : vvsVec)
    vpsPtr[c++] = vsVec.data();

  /* api call */
  foo(vpsPtr.data(), x, y);

  return 0;
}

我收到以下错误:

./dummy/main.cpp:15:错误:从不兼容的类型'void'分配给'__gnu_cxx::__alloc_traits<std::allocator<bool *> >::value_type'(又名'bool *')

./dummy/main.cpp:15: 错误: 无效值没有被忽略,因为它应该是 vpsPtr[c++] = vsVec.data();

拜托,有人可以解释我做错了什么以及如何解决这个问题吗?

谢谢。

4

2 回答 2

1

std::vector<bool>是它的特化std::vector,其行为与其他std::vectors 不同。它不一定连续存储元素。从cppreference

std::vector<bool>行为类似于std::vector,但为了节省空间,它:

  • 不一定将其元素存储为连续数组。
  • 将类公开std::vector<bool>::reference为访问单个位的方法。特别是,这个类的对象是 operator[]按值返回的。
  • std::allocator_traits::construct用于构造位值。
  • 不保证同一个容器中的不同元素可以被不同的线程同时修改。

节省空间的代价相对较高。例如,您不能用于data()获取指向bools 的连续数组的指针。如果你想要这样一个数组,你需要自己设置它。

于 2021-07-27T08:39:33.897 回答
0

问题是它std::vector<bool>是通用std::vector模板的一种特殊化,它以一种节省空间的方式存储值,这与任何其他数据类型不同(它每个值bool存储一位)。bool这意味着std::vector<bool>不能与任何其他向量在所有相同的上下文中使用。

您需要创建自己的动态分配数组来处理它:

std::vector<bool*> vpsPtr(vvsVec.size());
for (size_t i = 0; i < vvsVec.size(); ++i)
{
    vpsPtr[i] = new bool[vvsVec[i].size()];
    // TODO: Copy each and every vector element vvsVec[i][j] into vpsPtr[i][j]
}

完成后不要忘记delete[]记忆。

于 2021-07-27T08:38:09.720 回答