random_shuffle an einem struct?
-
hallo,
wie kann man die STL-funktion random_shuffle an einem struct durchführen?
das struct sieht so aus:
struct Solution { int Customer_ID; double tourLength; };ich würde gerne die Customer_ID durchmischen.
wisst ihr wie es gehen könnte?lg,
Don_Gunito
-
Du solltest dich genauer ausdrücken.
Normalerweise wendet man die
std::random_shuffle()auf Container an, du hast aber nichts dergleichen gesagt.Hast du einen Container mit
Solution-Einträgen, und unter diesen Einträgen willst du dieCustomer_ID-Member zufällig vertauschen?
-
hallo nexus,
danke für den input, ich habe mehrere instanzen eines structs (s.o.) in einen vector gepackt
vector<Customer> customer;und nun will ich die Customer_ID durchmischen.
Hast du einen Container mit Solution-Einträgen, und unter diesen Einträgen willst du die Customer_ID-Member zufällig vertauschen?
ich denke genau das hab ich gemacht...
besten dank für deine hilfe.
-
Hi,
also ich kann mir gerade nicht vorstellen, wo Dein Problem liegt. die Container-Algorithmen laufen auf einem vector<int> genauso wie auf einem vector<mein_ganz_persoenliches_wildes_spezial_struct>....
Oder möchtest Du die beinhalteten Objekte selbst verändern (also nicht nur ihre Reihenfolge im Container) ?
Hast Du sowas in der Art:
[1, 1.2] [2, 1.2] [2, 2.3] --> [1, 3.4] [3, 3.4] [3, 2.3]vor?
Dafür wäre random_shuffle() nicht gedacht. Oder Du müsstest erst Deinen vector "teilen", mischen und hinterher wieder neu zusammensetzen.
Sowas in der Art (ungetestet)int IDSelector(Solution const& s) { return s.customerID; } int tourLengthSelector(Solution const& s) { return s.tourLength; } vector<Solution> solutions; // irgendwie füllen vector<int> customerIDs; vector<double> tourLengths; transform(solutions.begin(), solutions.end(), back_inserter(customerIDs), IDSelector); transform(solutions.begin(), solutions.end(), back_inserter(tourLengths), tourLengthSelector); random_shuffle(customerIDs.begin(), customerIDs.end()); // ob man das auch für die tourLengths braucht, ist aufgabenspezifisch vector<Solution> newSolutions(customerIDs.size()); for(size_t i=0; i<customerIDs.size(); ++i) newSolutions[i] = Solution(customerIDs[i], tourLengths[i]); // geeigneten Ctor mal vorausgesetztGeht bestimmt auch besser - aber mal als Ideenskizze...
Gruß,
Simon2.
-
hallo nochmals,
also, was ich wirklich will ist die reihenfolge der structs im vector durchmischen.
so hätte ich es gern:
[1, 1.2] [2, 2.3] [2, 2.3] --> [1, 1.2] [3, 3.4] [3, 3.4]mit
random_shuffle(customer.begin(), customer.end());geht das.
besten dank leute!
-
Don_Gunito schrieb:
also, was ich wirklich will ist die reihenfolge der structs im vector durchmischen.
so hätte ich es gern:
[1, 1.2] [2, 2.3] [2, 2.3] --> [1, 1.2] [3, 3.4] [3, 3.4]Das wiederspricht sich aber schon ein wenig - aber ich nehm mal an, du hast die skizze missverstanden?!
struct Solution { int Customer_ID; //erster wert double tourLength; //zweiter wert };also lt. skizze wölltest du die customer-ids zufällig tauschen?! da du das aber offenbar nicht willst reicht ein einfacher
random_shuffle-Aufruf, wie du ihn auch geschrieben hast, aus.bb