0

我是 C++11 的新手,我对std::refence_wrapper类的使用感到困惑。

让我们考虑https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper中显示的示例 ,它对包含在标准中的元素进行了洗牌std::vector,即:

std::vector<int> l(10); 
std::iota(l.begin(), l.end(), -4);
std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});

现在,如果考虑原始向量l,我会l.data()返回一个指向内部数组的指针,我可以在 C 应用程序中使用它。

相反,我不清楚v.data(). 我尝试了各种肯定错误的演员组合,例如int* p = (int*)(v.data()->get())没有获得正确的结果(交换的值)。

我的目标是将 C++ 应用程序(它给了我一个引用包装器的向量)与旧的 C 库接口。v在示例中显示的随机播放之后,您能指出从 vector 获取类 C 数组的最正确方法吗?我是否需要将所有元素一个接一个地复制到另一个向量中?是否有任何 C++11 课程可以帮助我完成这项工作?谢谢

4

2 回答 2

5

reference_wrapper是 C++ 类型;您不应该只是将其交给 C API。如果您想将某些东西传递给 C API,那么它必须是 C 和 C++ 共享的东西。

如果该 C API 采用指向整数的指针数组,那么指向整数的指针就是您vector应该存储的内容。否则,是的,您必须将这些整数复制到 C 可以说的东西中。

于 2019-02-14T18:38:54.987 回答
0

经过更多思考,我想出了这个解决方案:

std::vector<int> l(10); 
std::iota(l.begin(), l.end(), -4);
std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});

std::vector<int> vec2 (v.begin(), v.end());
int* p = vec2.data();

因此,我将元素从复制v到新的 vector vec2p从中获得的 C 数组vec2现在有效。

我想知道是否有更好的方法来完成这项工作......

于 2019-02-14T22:08:31.397 回答