2011-05-20 19 views
0

下午好,我們正在Windows和Linux上用C++構建重複數據刪除程序的原型。昨天,我們在Stack Overflow上發佈了一個關於如何避免STL string深層複製的問題,當我們存儲std::string版本的記錄在std::string* StringArray中被重複刪除時,STL對stringmalloc進行了深層複製,新緩衝區至少爲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 stringstd::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對象?謝謝。

回答

1

你只下載了兩個實現文件嗎?我懷疑這會起作用,因爲它們很可能依賴於SGI STL實現中的其他文件。這將解釋爲什麼你不能建立它們...

最簡單的方法來獲得SGI繩索實施可能是使用STLport,這是一個端口和SGI STL進一步發展到多個平臺。雖然我還沒有嘗試過使用VS2008,但我很確定它是受支持的。

但是,您將需要使用STLport作爲完整的STL替換(它是),而不是提取一個或兩個類,並嘗試將其與VS2008附帶的STL實現一起使用。

也就是說,除非你喜歡重寫繩索類來與MS STL一起使用,但對我來說聽起來不是一個好主意。

+0

謝謝你的回答。其實我們昨晚確實下載了STLport,但我們只提取了1或2個Ropes類。但是,現在您有建議我們用完整的STLport替換替換Microsoft STL,我們必須構建一個新的VisualStudio C++項目。感謝您的幫助。 – Frank 2011-05-20 18:56:05

+0

你知道我們在哪裏可以找到關於如何使用繩索類的一些很好的文檔?我們還沒有找到關於ROpe的很多文檔。有沒有Ropes郵件列表?謝謝, – Frank 2011-05-20 19:13:49

+0

這裏有一些很好的Ropes文檔的鏈接,>謝謝。 – Frank 2011-05-20 20:05:40

相關問題