如何从std :: vector <std :: reference_wrapper>获取C数组

时间:2019-02-14 18:35:49

标签: c c++11 stdvector reference-wrapper

我是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获得类C数组的最正确方法吗?我是否需要在另一个向量中一一复制所有元素? 是否有任何C ++ 11类可以帮助我完成工作? 谢谢

2 个答案:

答案 0 :(得分:5)

reference_wrapper是C ++类型;您不应该将其移交给C API。如果要将某些内容传递给C API,则它必须是C和C ++共享的内容。

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

答案 1 :(得分: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复制到新的向量vec2。从p获得的C数组vec2现在有效。

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