如何解决将布尔向量的向量转换为指针的指针
我遇到了一个类似于问题 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 举报,一经查实,本站将立刻删除。