将动态数组包装到STL/Boost容器中?

Ant*_*kov 8 c++ arrays containers boost vector

我需要将一个动态分配的数组(例如从a = new double [100])包装到std :: vector(最好)而不复制数组.这个限制强加于我想要包装的数组是从文件中进行mmaped,所以只做vector(a,a + size)会使内存使用量加倍.

这样做有什么窍门吗?

Mic*_*urr 11

对此最好的解决方案之一就是STLSoft的array_proxy <>模板.不幸的是,doxygen从源代码生成的doc页面并不是理解模板的很多帮助.源代码实际上可能会更好一些:

array_proxy<>模板在Matthew Wilson的书"Imperfect C++"中有很好的描述.我使用的版本是STLSoft网站上的版本的简化版本,所以我没有必要拉入整个库.我的版本不是那么便携,但是这比STLSoft上的版本要简单得多(它跳过了很多可移植性的箍).

如果你设置一个这样的变量:

int myArray[100];

array_proxy<int> myArrayProx( myArray);
Run Code Online (Sandbox Code Playgroud)

变量myArrayProx有很多的STL接口- ,begin(),end(),size()迭代器等.

所以在很多方面,array_proxy<>对象的行为就像一个向量(虽然push_back()它不存在,因为array_proxy<>它不能增长 - 它不管理数组的内存,它只是将它包含在更接近向量的东西中).

一个非常好的方法array_proxy<>是,如果将它们用作函数参数类型,该函数可以确定传入的数组的大小,而本机数组则不然.并且包装数组的大小不是模板类型的一部分,因此使用起来非常灵活.


Éri*_*ant 9

一个升压:: iterator_range的提供一个容器一样的界面:

// Memory map an array of doubles:
size_t number_of_doubles_to_map = 100;
double* from_mmap = mmap_n_doubles(number_of_doubles_to_map);

// Wrap that in an iterator_range
typedef boost::iterator_range<double*> MappedDoubles;
MappedDoubles mapped(from_mmap, from_mmap + number_of_doubles_to_map);

// Use the range
MappedDoubles::iterator b = mapped.begin();
MappedDoubles::iterator e = mapped.end();
mapped[0] = 1.1;
double first = mapped(0);

if (mapped.empty()){
    std::cout << "empty";
}
else{
    std::cout << "We have " << mapped.size() << "elements. Here they are:\n"
       << mapped;
}
Run Code Online (Sandbox Code Playgroud)