微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将布尔向量的向量转换为指针的指针

如何解决将布尔向量的向量转换为指针的指针

我遇到了一个类似于问题 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<bool>std::vector 的特化,其行为与其他 std::vector 不同。它不一定连续存储元素。来自cppreference

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

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

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

,

问题在于 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[]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。