我遇到了一个类似于将矢量的矢量转换为指针的指针问题中提到的问题。
唯一的区别是,我必须使用布尔型而不是短裤。
但是如果我编译这个代码:
#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<std::分配器<bool*>gt;:value_type'(又名"bool*")来自不兼容类型"void">
和
/dummy/main.cpp:15:错误:无效值未被忽略为应该是vpsPtr[c++]=vsVec.data();
请有人解释我做错了什么以及如何解决这个问题吗?
谢谢。
std::vector<bool>
是std::vector
的特殊化,其行为与其他std::vector
不同。它不一定连续存储元素。来自cppreference:
std::vector<bool>
的行为与std::vector
类似,但为了节省空间,它:
- 不一定将其元素存储为连续数组
- 将类
std::vector<bool>::reference
公开为访问单个位的方法。特别是,此类的对象由CCD_ 7的值- 不使用
std::allocator_traits::construct
来构造位值- 不能保证同一容器中的不同元素可以由不同的线程同时修改
节省空间的代价相对较高。例如,您不能使用data()
来获取指向bool
s的连续数组的指针。如果您想要这样的数组,您需要自己设置。
问题是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[]
。