如何在Windows Visual Studio 8.0中使用SGI Ropes?

时间:2011-05-20 18:35:04

标签: c++ windows linux string stl

下午好,我们正在Windows和Linux上使用C ++构建重复数据删除程序的原型。昨天,我们在Stack Overflow上发布了一个关于如何避免STL string深度复制的问题,当我们存储std::string版本的记录以在std::string* StringArray中重复删除时,STL会进行深层复制stringmalloc的新缓冲区至少为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 Libary中实现的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文档后,我们仍然没有90%肯定如何将C / C ++ char*指针的空终止内容转换为Ropes对象。另外,我们如何push_back将Ropes对象vector放到STL容器上,例如vector?最后,我们如何从STL {{1}}容器中检索Ropes对象?谢谢。

1 个答案:

答案 0 :(得分:1)

您是否只下载了两个实施文件?我怀疑这会起作用,因为它们很可能依赖于SGI STL实现中的其他文件。这可以解释为什么你不能建造它们......

获得SGI绳索实施的最简单方法可能是使用STLport,这是一个端口,并将SGI STL进一步开发到多个平台。我没有尝试过用VS2008,但我很确定它是支持的。

但是,您需要使用STLport作为完整的STL替换(它是),而不是提取一个或两个类,并尝试将其与VS2008附带的STL实现一起使用。

也就是说,除非你想把绳子类改写成MS STL的开箱即用,但这对我来说听起来不是一个好主意。