2015-09-30 27 views
1

在我目前的任務中,我需要從數據庫中讀取大約10,000條記錄(學生數據),並且需要將它們存儲在容器中。現在我需要選擇容器來存儲所有這些記錄以生成報告。報告生成選項是供應商特定的,因爲一個供應商想要轉儲所有記錄而不進行排序,而其他供應商想要根據已排序的名稱字段生成報告。我從中選擇了矢量,因爲我不需要在中間插入任何類型的插件,並且對於第一個選項(報告沒有對字段進行排序)不需要搜索工作,但對於第二個選項,任何人都可以向我建議,如果矢量是合適的選項同樣通過引入基於名稱字段的排序。選擇插入多個數據庫的容器

下面是我在斯科特邁爾斯書(Effective STL)第23項中找到的一些有用的指針。我相信基於以下信息的第二選擇排序向量需要使用,但我仍然希望有人能夠通過一些光線在這之前,我得出任何結論,並開始編碼。

項23.考慮具有排序的矢量

替換關聯容器「**標準關聯容器通常被實現爲平衡二叉搜索樹。一個平衡二叉搜索樹是對於混合組合優化的數據結構插入,刪除和查找,也就是說,它被設計用於執行一些插入操作的應用程序,然後進行一些查找,然後再插入一些內容,然後進行一些刪除操作,然後再進行一些查找操作,然後再插入或刪除操作,然後更多的查找等等。這一系列事件的關鍵特徵是插入,刪除和查找都混在一起,一般來說,沒有辦法預測樹上的下一個操作是什麼「

+1

只需循環遍歷向量,只挑選出符合條件的記錄?實際上10000個元素並沒有那麼多。如果你使用例如,它可以變得非常簡單(從你的角度來看)。['std :: copy_if'](http://en.cppreference.com/w/cpp/algorithm/copy)將想要的元素複製到另一個矢量(藉助於['std :: back_inserter']]( http://en.cppreference.com/w/cpp/iterator/back_inserter))。 –

回答

0

正如Scott Meyers所建議的std::vector是一個非常好的容器,用於存儲數據並對其進行操作 - 除了一些例外 - 如果數據相當大 - 不僅包括元素數量,還包括元素大小。

您可以通過不操作數據本身來減少操作數據的大小,而是通過操作指數來處理數據。

假設您已經向量,從文件中讀取:

struct Element { .... }; 
std::vector<Element> data; 
readData(someFile); 

您可以通過創建索引,例如向量生成的這些記錄的「自然秩序」(見iota on cppreference):

using indices = std::vector<std::size_t>; 
indices naturalOrder(data.size()); 
std::iota(naturalOrder.begin(), naturalOrder.end(), 0); // filled with 0,1,2,... 

要打印使用此索引的記錄 - 定義此類算法:

template <typename Container, typename Indices, typename Operation> 
void for_erach(Container&& container, const Indices& indices, Operation&& op) 
{ 
    for (auto i: indices) 
     op(container[i]); 
} 

// print in natural order 
for_each(data, naturalOrder, [] (auto const& e) { 
    std::cout << e << std::endl; 
}); 

T o排序,只是對索引進行排序:

Indices sorterdByXOrder = naturalOrder; 
auto lessX = [&data](auto i, auto j) { return data[i].x < data[j].x; }; 
std::sort(sorterdByXOrder.begin(), sorterdByXOrder.end(), lessX); 
// print in sorted by x order 
std::cout << "Sorted by x:" << std::endl; 
for_each(data, sorterdByXOrder , [] (auto const& e) { 
    std::cout << e << std::endl; 
}); 

只有例如element.y == 7 - 做到這一點:

Indices onlyY7Order; 
auto yIs7 = [&data](auto i) { return data[i].y == 7; }; 
std::copy_if(naturalOrder.begin(), naturalOrder.end(), 
      std::back_inserter(onlyY7Order), yIs7); 

,如果您有性能問題,閱讀整個數據std::vector - 你可以用std::deque嘗試 - 在某些情況下可能會更快。我提交的其餘代碼不會改變 - 因爲std::dequestd::vector具有非常相似的接口...