下午好,我们正在Windows和Linux上使用C ++构建重复数据删除程序的原型。昨天,我们在Stack Overflow上发布了一个关于如何避免STL string
深度复制的问题,当我们存储std::string
版本的记录以在std::string* StringArray
中重复删除时,STL会进行深层复制string
和malloc
的新缓冲区至少为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对象?谢谢。
答案 0 :(得分:1)
您是否只下载了两个实施文件?我怀疑这会起作用,因为它们很可能依赖于SGI STL实现中的其他文件。这可以解释为什么你不能建造它们......
获得SGI绳索实施的最简单方法可能是使用STLport,这是一个端口,并将SGI STL进一步开发到多个平台。我没有尝试过用VS2008,但我很确定它是支持的。
但是,您需要使用STLport作为完整的STL替换(它是),而不是提取一个或两个类,并尝试将其与VS2008附带的STL实现一起使用。
也就是说,除非你想把绳子类改写成MS STL的开箱即用,但这对我来说听起来不是一个好主意。