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

How to use SGI Ropes with Windows Visual Studio 8.0?

本文关键字:SGI Ropes Windows Visual Studio      更新时间:2023-10-16

下午好,我们正在构建一个带有 Windows 和 Linux C++的重复数据删除程序的原型。昨天,我们在 Stack Overflow 上发布了一个问题,关于当我们将记录的std::string版本存储到 deduped 时,如何避免 STL string深度复制 std::string* StringArray ,STL 会制作string的深度副本,并malloc至少 160,000,000 字节的新缓冲区。我们很快就会耗尽堆内存并得到std::bad_alloc异常

Stack Overflow专家回答了建议使用更好的绳类(如SGI的绳索)的问题,因为绳索特别适合处理非常大的绳子。於是我們下載了SGI的ropes.c和rope.h版本。但是,我们无法在Windows Visual Studio 2008上编译ropes.c和ropes.h。此外,我们找不到如何使用 SGI C++ Ropes 界面的任何示例。

因此,我们下载了Paul Hsieh的Better String Library。 我们修改了 STL 源代码以使用更好的字符串库中嵌入的 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* 指针的 null 终止内容转换为 Ropes 对象仍然没有 90% 的积极态度。此外,我们如何将 Ropes 对象push_back到 STL 容器(如 vector )上?最后,我们如何从 STL vector容器中检索 Ropes 对象?谢谢。

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

实现

SGI绳索的最简单方法可能是使用STLport,这是一个端口,也是SGI STL在多个平台上的进一步发展。我还没有尝试在VS2008中使用它,但我很确定它受支持。

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

也就是说,除非您喜欢重写绳索类以使用 MS STL 开箱即用,但这对我来说听起来不是一个好主意。