给定一个指向char数组的指针,是否可以从中构造一个std :: vector或boost :: array,并避免内存复制?
提前致谢!
答案 0 :(得分:6)
因为向量拥有自己的分配器和存储器,所以没有办法(对于move_iterator
的非原始元素构造可能有所帮助)。
因此,假设目标是为现有存储获得真正的std::vector<char>&
,那么即使使用自定义分配器¹也不会成功。
如果您想要字符串,可以使用boost::string_ref
(utility/string_ref.hpp
)。
否则,您可以使用1维multi_array_ref
(来自Boost Multi Array)
这绝对是最简单的:
<强> 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;
}
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
¹专业std::allocator<char>
太难以考虑,可能完全被标准所禁止
答案 1 :(得分:1)
不使用提升的替代方案是std::reference_wrapper
#include <vector>
#include <iostream>
#include <functional>
using namespace std;
struct S
{
S() : val(0) {}
S(int val_) : val(val_) {}
S(const S& other) : val(other.val) {
cout << "copy" << endl;
}
int val;
};
int main()
{
char a[] = "Hello";
vector<reference_wrapper<char>> v(a, a+5);
S vS[] = {S(1), S(2), S(3)};
vector<S> v_copy(vS, vS + 3);
vector<reference_wrapper<S>> v_nocopy(vS, vS+3);
}
使用struct S
可以看到对象没有复制到向量中。所以这对char
也适用。