如何在Windows Visual Studio 8.0中使用SGI Ropes
How to use SGI Ropes with Windows Visual Studio 8.0?
下午好,我们正在构建一个带有 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 开箱即用,但这对我来说听起来不是一个好主意。
- SGI STL 中的绑定好友模板
- 在SGI STL的实现中,向量的push_back函数不使用默认参数
- 为什么value_type函数返回SGI STL中的指针
- SGI hash_map:基本咨询
- EASTL和SGI哈希表的实现
- SGE中SGI机器的cpu负载失控
- 在 SGI STL 的实现中,文件 stl_alloc.h 中模板参数"int inst"的功能是什么?
- 如何在Windows Visual Studio 8.0中使用SGI Ropes
- 为什么 SGI stl 源代码使用 #if 0
- 为什么SGI STL源代码在运算符新函数前面使用双冒号
- 为什么SGI STL不使用复制和交换习惯用语?
- 如何在VS2005中使用sgi hash_table