加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:58:28 所属栏目:百科 来源:网络整理
导读:给定一个char数组的指针,是否可以从中构造一个std :: vector或boost :: array,并避免内存复制? 提前致谢! 解决方法 因为向量拥有自己的分配器和存储器,所以没有办法(对于非原始元素,move_iterators构造可能会有所帮助). 所以假设目标是得到一个真正的std :
给定一个char数组的指针,是否可以从中构造一个std :: vector或boost :: array,并避免内存复制?

提前致谢!

解决方法

因为向量拥有自己的分配器和存储器,所以没有办法(对于非原始元素,move_iterators构造可能会有所帮助).

所以假设目标是得到一个真正的std :: vector< char>&对于现有的存储,你永远不会成功,甚至不能使用自定义分配器1.

如果需要字符串,可以使用boost :: string_ref(在utility / string_ref.hpp中).

否则,您可以使用1维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

这是更多功能的,如果你不适合字符串界面,它会“更好”.

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

1专门化std :: allocator< char>是太邪恶无法考虑,可能完全被标准所禁止

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读