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

时间:2015-07-01 21:13:35

标签: c++ arrays boost stdvector

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

提前致谢!

2 个答案:

答案 0 :(得分:6)

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

因此,假设目标是为现有存储获得真正的std::vector<char>&,那么即使使用自定义分配器¹也不会成功。

如果您想要字符串,可以使用boost::string_refutility/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

¹专业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也适用。