如何在 C++ 中有效地将数组移动到向量?

Jon*_*ung 3 c++ performance vector c++11

我正在使用一个函数,该函数需要我传入一个 C 样式数组,以便它可以填充数据。但是,结果数组必须转换为向量,以便可以将其传递给另一个需要它的函数。向量约束是很难的,没有办法绕过它。我可以想象重新设计另一个函数,以便它需要一个向量,但如果它可以有效地完成,我不希望这样做。具体来说,如果可能的话,我希望不要将数据从数组复制到向量。作为一个最小的示例,请使用以下程序:

\n
#include <iostream>\n#include <algorithm>\n#include <vector>\n#include <chrono>\n\nusing namespace std::chrono;\n\nstatic uint LENGTH = 10000000;\n\n\nuint now() {\n    return duration_cast<microseconds>\n            (system_clock::now().time_since_epoch()).count();\n}\n\nvoid put_data_in_array(char *data) {\n    std::cout << now() << " filling array\\n";\n    for (uint i = 0; i < LENGTH; i++) {\n        data[i] = i;\n    }\n    std::cout << now() << " filled array\\n";\n}\n\nint main () {\n    std::cout << now() << " making array\\n";\n    char *array = new char[LENGTH];\n    std::cout << now() << " made array\\n";\n    put_data_in_array(array);\n    std::cout << now() << " function returned\\n";\n    std::vector<char> v;\n    std::move(array, array + LENGTH, std::back_inserter(v));\n    std::cout << now() << " switched to vector\\n";\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

产生以下输出:

\n
1970760826 making array\n1970760926 made array\n1970760927 filling array\n1970774417 filled array\n1970774421 function returned\n1970879936 switched to vector\n
Run Code Online (Sandbox Code Playgroud)\n

意义:

\n
100 \xc2\xb5s to allocate memory for the array\n13490 \xc2\xb5s to fill the array\n105515 \xc2\xb5s to move the array to a vector\n
Run Code Online (Sandbox Code Playgroud)\n

理想情况下,我希望将数组移动到向量的时间非常小。如果可能的话,我想告诉向量取得现有数组的所有权。但是,如果将其传输到向量的时间可以接近(少于两倍)填充数组所需的时间,我会很高兴。

\n

谢谢你提供的所有帮助。

\n

编辑:

\n

感谢您的快速反馈!事实证明,通过v.data()可能是实现我正在寻找的目标的最佳方式。我真的一点也不关心array,我只知道我必须将一个数组传递给函数。

\n

Mar*_*som 5

无法避免将数组复制到向量。

最有效的方法应该是使用向量构造函数来进行复制。使用两个指针,其作用类似于开始/结束迭代器。

std::vector<int64_t> v(array, array + LENGTH);
Run Code Online (Sandbox Code Playgroud)