【发布时间】:2011-05-20 18:35:03
【问题描述】:
下午好,我们正在使用 C++ 在 Windows 和 Linux 上构建重复数据删除程序的原型。昨天,我们在 Stack Overflow 上发布了一个关于如何避免 STL string 深拷贝的问题,当我们将 std::string 版本的记录存储到 std::string* StringArray 中进行重复数据删除时,STL 会制作 string 的深拷贝和mallocs 一个至少 160,000,000 字节的新缓冲区。我们很快耗尽了堆内存并得到了std::bad_alloc 异常
Stack Overflow 专家回答了建议使用更好的字符串类(例如 SGI 的 Ropes)的问题,因为 Ropes 尤其适用于处理非常大的字符串。所以我们下载了 SGI 的ropes.c 和rope.h 的一个版本。但是,我们无法在 Windows Visual Studio 2008 上编译ropes.c 和ropes.h。此外,我们找不到任何关于如何使用SGI C++ Ropes 接口的示例。
所以我们下载了 Paul Hsieh 的 Better String Library。我们修改了 STL 源代码以使用在 Better String 库中实现的 bstring 类。这是我们代码的摘录:
std::vector< bstring > BStringVector;
bstring b = bfromcstr(curr.getPtr());
char* const resultptr = (curr.getPtr() + n);
resultptr[STRING_SIZE] = '\x0';
BStringVector.push_back(b);
curr.mPtr = (char*)bstr2cstr(BStringVector.back(),' ');
std::multiset<Range>::iterator miter = ranges_type.lower_bound(Range(n));
(*miter).mPtr = curr.mPtr;
free (b);
return (char*)(resultptr);
这个新代码生成的std::bad_alloc 异常少于STL string 类,但我们知道Ropes 是处理超大字符串的最佳类。所以我们需要知道如何在 Windows Visual Studio 2008 上使用 SGI 源代码。在 Ropes 代码中有很多 SGI 特定的头文件。对应的Windows Visual Studio 2008 C++头文件有哪些?
此外,在阅读了 Ropes 文档后,我们对于如何将 C/C++ char* 指针的以空结尾的内容转换为 Ropes 对象仍然没有 90% 的肯定。此外,我们如何将push_back 一个 Ropes 对象放到诸如vector 这样的 STL 容器上?最后,我们如何从 STL vector 容器中检索 Ropes 对象?谢谢。
【问题讨论】:
标签: c++ windows linux string stl