【问题标题】:Convert vector of vector of bools to pointer of pointers将布尔向量的向量转换为指针的指针
【发布时间】:2021-07-27 08:30:48
【问题描述】:

我有一个问题类似于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:错误:分配给 '__gnu_cxx::__alloc_traits<:allocator> >::value_type'(又名 'bool *') 来自不兼容的类型'void'

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

拜托,谁能解释一下我做错了什么以及如何解决这个问题?

谢谢。

【问题讨论】:

  • 解决这个难题的一个常见方法是将布尔向量表示为std::vector&lt;char&gt;。如果需要强类型,可以使用enum class fake_bool : char { fake_false, fake_true }; 或类似的东西。为了更方便,您可以实现与bool 之间的转换运算符。
  • @KondradRudolph 我在考虑通常的替代品,但是当目标是获得bool** 时,我不确定它们是否适用

标签: c++ c++11 vector raw-pointer


【解决方案1】:

std::vector&lt;bool&gt;std::vector 的特化,其行为与其他 std::vectors 不同。它不一定连续存储元素。来自cppreference

std::vector&lt;bool&gt; 的行为类似于 std::vector,但为了 节省空间,它:

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

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

【讨论】:

    【解决方案2】:

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

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

    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[]内存。

    【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多