gpt4 book ai didi

c++ - 如何在不复制的情况下从 C 数组构造 std::vector 或 boost::array?

转载 作者:太空狗 更新时间:2023-10-29 20:11:49 24 4
gpt4 key购买 nike

给定一个指向 char 数组的指针,是否可以从中构造一个 std::vector 或 boost::array,并避免内存复制?

提前致谢!

最佳答案

因为 vector 拥有自己的分配器和类似的存储空间,所以没有办法(对于来自 move_iterator 的非原始元素构造可能会有一点帮助)。

因此假设目标是获得一个真实的 std::vector<char>&对于现有存储,您永远不会成功,即使使用自定义分配器也不行。


如果你想要一个字符串,你可以使用boost::string_ref (在 utility/string_ref.hpp 中)。

否则,您可以使用一维 multi_array_ref (来自 Boost Multi Array)

1。使用 string_ref

这绝对是最简单的:

Live On Coliru

#include <boost/utility/string_ref.hpp>
#include <iostream>

using boost::string_ref;

int main() {
char some_arr[] = "hello world";

string_ref no_copy(some_arr);

std::cout << no_copy;
}

2。 multi_array_ref

如果您不适合字符串接口(interface),这会更通用,并且工作“更好”。

Live On Coliru

#include <boost/multi_array/multi_array_ref.hpp>
#include <iostream>

using ref = boost::multi_array_ref<char, 1>;
using boost::extents;

int main() {
char some_arr[] = "hello world";

ref no_copy(some_arr, extents[sizeof(some_arr)]);

std::cout.write(no_copy.data(), no_copy.num_elements());
}

两个例子都打印

hello world

¹ 特化 std::allocator<char>太邪恶了,可能被标准完全禁止

关于c++ - 如何在不复制的情况下从 C 数组构造 std::vector 或 boost::array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com