下午好,我们正在构建一个在Windows和Linux上使用C++的重复数据删除程序的原型。昨天,我们在堆栈溢出上发布了一个关于如何避免STL string深度复制的问题,当我们在std::string* StringArray中存储要去重的记录的std::string版本时,STL会制作string的深度副本,并且malloc会创建至少160,000,000字节的新缓冲区。我们很快就用完了堆内存,并得到了一个std::bad_alloc异常
Stack Overflow专家回答了问题,建议使用更好的string类,例如SGI的Ropes,因为Ropes特别适合处理非常大的字符串。因此,我们下载了SGI的ropes.c和rope.h的一个版本。但是,我们无法在Windows Visual Studio 2008上编译ropes.c和ropes.h。此外,我们也找不到任何如何使用SGI C++ Ropes接口的示例。
所以我们下载了Paul Hsieh的一个更好的字符串库。我们修改了我们的STL源代码,以使用在更好的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); 与STL string类相比,这个新代码生成的std::bad_alloc异常更少,但我们知道Ropes是处理非常大的字符串的最佳类。所以我们需要知道如何在Windows Visual Studio2008上使用SGI源代码。在Ropes代码中有很多SGI特定的头文件。对应的Windows Visual Studio2008 C++头文件是什么?
此外,在阅读了Ropes文档之后,我们对如何将C/C++ char*指针的以null结尾的内容转换为Ropes对象仍然没有90%的把握。此外,我们如何将push_back对象放到vector这样的STL容器上?最后,我们如何从STL vector容器中检索Ropes对象?谢谢。
发布于 2011-05-21 02:46:18
您是否只下载了两个实现文件?我怀疑这是否会起作用,因为它们最有可能依赖于SGI STL实现中的其他文件。这就解释了为什么你不能建造它们..。
获得SGI实现的最简单方法可能是使用STLport,它是SGI STL到多个平台的移植和进一步开发。虽然我还没有尝试在VS2008中使用它,但我非常确定它是受支持的。
但是,您将需要使用STLport作为完整的STL替代(事实确实如此),而不是提取一个或两个类并尝试将其用于VS2008附带的STL实现。
也就是说,除非您想用MS STL重写rope类来开箱即用,但对我来说这听起来不是一个好主意。
https://stackoverflow.com/questions/6076225
复制相似问题