【发布时间】:2019-05-06 08:51:41
【问题描述】:
我正在处理一个无法更改数据类型的库。我需要调用一个带有bool 数组的函数。我正在使用的代码使用std::vector<bool> 来存储布尔值。我已经阅读了很多关于std::vector<bool> 和 SO 相关问题的信息,但我还没有找到最优雅的解决方案来解决我的问题。这是一个性能至关重要的代码。如何以最有效的方式处理这个问题?我可以更改存储在std::vector 中的类型,但我无法逃避使用std::vector。
在我自己的问题中,我必须调用 Fortran 函数,但我用 C++ 制作了一个最小示例来说明问题。
#include <cstdio>
#include <vector>
void print_c_bool(bool* bool_array, size_t n)
{
for (int i=0; i<n; ++i)
printf("%d, %d\n", i, bool_array[i]);
}
int main()
{
// This works.
bool bool_array[5] = {true, false, false, true, false};
print_c_bool(bool_array, 5);
// This is impossible, but how to solve it?
std::vector<bool> bool_vector {true, false, false, true, false};
// print_c_bool(bool_vector.data(), bool_vector.size());
return 0;
}
【问题讨论】:
-
std::vector<char>可用于保存0s 或1s,但我也希望看到更好的解决方法 -
你必须构造一个布尔数组,这是唯一的方法。
-
这个怎么样:
std::vector<char> bool_vector{ 1, 0 }; print_c_bool((bool *)bool_vector.data(), bool_vector.size());?大概。 -
@vahancho 否。它违反了严格的别名规则,并且在
sizeof(char) != sizeof(bool)和其他情况下不起作用。 -
恐怕你必须接受
std::vector<bool>::data不是布尔数组的事实,如果你需要一个,那么你必须使用std::vector<bool>以外的其他东西