Optimaler container für viele inserts + find_if?
-
Hallo,
ich habe eine Funktion in meinem Code, welche laut Profiler weit über 90% der gesamten Laufzeit beansprucht. Die Funktion sieht so aus:
struct data { double error; std::vector<int> values; }; std::vector<data> data_container; bool contains_data(data const &dat, std::vector<data>::iterator &it) { // Das hier ist langsam it = std::find_if(data_container.begin(), data_container.end(), [&dat](data const &d) { return dat.values == d.values; }); return it != data_container.end(); }Also ich habe ein struct
data, welches einenvector<int>und eindoublebeinhaltet. Der vector kann dabei beliebig lang sein (üblicherweise zwischen 10 - 100 Elementen).Dann hab ich einen
vector<data>, der hier mitdata_containerbezeichnet ist. Dieser wird während der Laufzeit des Programs sehr schnell befüllt und hat nach wenigen Minuten bereits mehrere 100000 Elemente (oder noch mehr).Das Suchen in diesem (rasant wachsenden) vector stellt sich jetzt als Performance-Problem heraus... Welche Datenstruktur würdet ihr für so eine Anwendung empfehlen?
-
std::set bzw. std::unordered_set?
-
sat schrieb:
std::set bzw. std::unordered_set?
Ja also an
unordered_sethab ich auch schon gedacht (die Reihenfolge ist egal, deswegen istunordered_setwahrscheinlich besser alsset), aber wie kann ich einenvector<int>als key in einemunordered_setbenutzen?Dafür braucht man ja wahrscheinlich eine eigene hash Funktion, aber wie soll die bei einem vector aussehen?
-
http://stackoverflow.com/questions/20511347/a-good-hash-function-for-a-vector
ganz unten
std::size_t operator()(std::vector<uint32_t> const& vec) const { std::size_t seed = 0; for(auto& i : vec) { seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2); } return seed; }
-
Ok danke, werd ich mal ausprobieren

-
boost::hash kann auch
vector. Aber das wäre natürlich zu einfach.