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