mekakic
2013-02-07, 16:29:56
Hallo,
Ich hab eine Liste mit Elementen und möchte dort iterativ Elemente heraussieben bzw. filtern. Und wenn möglich relativ performant (Bzw. ich möchte negativ sieben aber das ist ja egal) und ohne viel Kopiererei... momentan kopiere ich viel; die listen sind riesig und die Performance schrecklich. Ich überlege schon das selber zu machen aber etwas derartiges muß doch auch existieren (STL, boost, ...)? Ich kenne das zumindest als klassische Listenoperation in einigen funktionalen Programmiersprachen.
Die genaue Implementierung des Filters, wäre eine Sache des Compare Operators... mir geht es darum irgendwie Elemente in einer sehr großen Liste nichtdestruktiv zu taggen (gehört das Element zur aktuellen Menge oder nicht)... und weitere Operationen beruhen dann bis zu einem reset immer auf der gefilterten Liste.
In etwa so:
list<linedb_t> mylist;
size_t sz=mylist.size(); //20000 elemente
mylist.filter("identifier_str1");
sz=mylist.size(); //500 elemente
mylist.filter("identifier_str2");
sz=mylist.size(); //50
mylist.filter("identifier_str3");
sz=mylist.size(); //3 Elemente
for(auto it=mylist.begin();it!=mylist.end();++it) {
/// 1,2,3
}
mylist.clear_filter();
sz=mylist.size(); //20000 Elemente
Am Ende hab ich dann noch drei Elemente übrig, auf die alle Kritierien zutreffen "identifier_str1", "identifier_str2" und "identifier_str3" und zu diesem Punkt ist man iterativ gekommen... eine Filterung aller Ausdrücke zu einem Zeitpunkt geht nicht. Und auch die Anzahl der Ausdrücke ist variabel... irgendwann weiß man eben dass man fertig ist. Geht sowas bzw. gibt es da "schlüsselfertige" Datenstrukturen für C++ für?
Danke!!
Ich hab eine Liste mit Elementen und möchte dort iterativ Elemente heraussieben bzw. filtern. Und wenn möglich relativ performant (Bzw. ich möchte negativ sieben aber das ist ja egal) und ohne viel Kopiererei... momentan kopiere ich viel; die listen sind riesig und die Performance schrecklich. Ich überlege schon das selber zu machen aber etwas derartiges muß doch auch existieren (STL, boost, ...)? Ich kenne das zumindest als klassische Listenoperation in einigen funktionalen Programmiersprachen.
Die genaue Implementierung des Filters, wäre eine Sache des Compare Operators... mir geht es darum irgendwie Elemente in einer sehr großen Liste nichtdestruktiv zu taggen (gehört das Element zur aktuellen Menge oder nicht)... und weitere Operationen beruhen dann bis zu einem reset immer auf der gefilterten Liste.
In etwa so:
list<linedb_t> mylist;
size_t sz=mylist.size(); //20000 elemente
mylist.filter("identifier_str1");
sz=mylist.size(); //500 elemente
mylist.filter("identifier_str2");
sz=mylist.size(); //50
mylist.filter("identifier_str3");
sz=mylist.size(); //3 Elemente
for(auto it=mylist.begin();it!=mylist.end();++it) {
/// 1,2,3
}
mylist.clear_filter();
sz=mylist.size(); //20000 Elemente
Am Ende hab ich dann noch drei Elemente übrig, auf die alle Kritierien zutreffen "identifier_str1", "identifier_str2" und "identifier_str3" und zu diesem Punkt ist man iterativ gekommen... eine Filterung aller Ausdrücke zu einem Zeitpunkt geht nicht. Und auch die Anzahl der Ausdrücke ist variabel... irgendwann weiß man eben dass man fertig ist. Geht sowas bzw. gibt es da "schlüsselfertige" Datenstrukturen für C++ für?
Danke!!