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<>
是,如果将它们用作函数参数类型,该函数可以确定传入的数组的大小,而本机数组则不然.并且包装数组的大小不是模板类型的一部分,因此使用起来非常灵活.
一个升压:: 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)
归档时间: |
|
查看次数: |
2492 次 |
最近记录: |