我是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类可以帮助我完成工作?
谢谢
答案 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
现在有效。
我想知道是否有更好的方法来完成这项工作...