下午好,我們正在Windows和Linux上用C++構建重複數據刪除程序的原型。昨天,我們在Stack Overflow上發佈了一個關於如何避免STL string
深層複製的問題,當我們存儲std::string
版本的記錄在std::string* StringArray
中被重複刪除時,STL對string
和malloc
進行了深層複製,新緩衝區至少爲160,000,000字節。我們很快用完堆內存,並得到一個std::bad_alloc
異常如何在Windows Visual Studio 8.0中使用SGI Ropes?
堆棧溢出專家誰回答了問題建議使用更好的字符串類,如SGI的繩索becuases繩索特別是處理非常大的字符串buit。所以我們下載了一個SGI的ropes.c和rope.h版本。但是,我們無法在Windows Visual Studio 2008上編譯ropes.c和ropes.h。另外,我們找不到任何有關如何使用SGI C++ Ropes接口的示例。
所以我們下載了保羅謝的一個更好的絃樂庫。我們修改了我們的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);
這個新的代碼生成比STL string
類std::bad_alloc
異常少,但我們知道繩索是用來處理非常大的字符串最好的類。所以我們需要知道如何在Windows Visual Studio 2008上使用SGI源代碼。在Ropes代碼中有很多SGI特定的頭文件。什麼是相應的Windows Visual Studio 2008 C++頭文件?
此外,在閱讀Ropes文檔後,我們仍未對如何將C/C++ char*
指針的空終止內容轉換爲Ropes對象的90%肯定做出肯定。另外,我們如何將一個Ropes對象push_back
拖放到STL容器上,如vector
?最後,我們如何從STL vector
容器中檢索Ropes對象?謝謝。
謝謝你的回答。其實我們昨晚確實下載了STLport,但我們只提取了1或2個Ropes類。但是,現在您有建議我們用完整的STLport替換替換Microsoft STL,我們必須構建一個新的VisualStudio C++項目。感謝您的幫助。 – Frank 2011-05-20 18:56:05
你知道我們在哪裏可以找到關於如何使用繩索類的一些很好的文檔?我們還沒有找到關於ROpe的很多文檔。有沒有Ropes郵件列表?謝謝, – Frank 2011-05-20 19:13:49
這裏有一些很好的Ropes文檔的鏈接,>謝謝。 –
Frank
2011-05-20 20:05:40