将std :: vector <bool>传递给外部函数

Chi*_*iel 2 c++ boolean hpc stdvector

我正在处理无法更改数据类型的库。我需要调用一个需要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;
}
Run Code Online (Sandbox Code Playgroud)

Kam*_*Cuk 5

您知道您必须要做的...创建临时布尔数组并复制值。

auto v = new bool[bool_vector.size()];
std::copy(bool_vector.begin(), bool_vector.end(), v);
print_c_bool(v, bool_vector.size());
delete[] v;
Run Code Online (Sandbox Code Playgroud)

要么

auto v = std::make_unique<bool>(bool_vector.size());
std::copy(bool_vector.begin(), bool_vector.end(), v.get());
print_c_bool(v.get(), bool_vector.size());
Run Code Online (Sandbox Code Playgroud)