MlodyInformatyk
#programowanie #cplusplus #cpp

Mam wektor wektorów w którym przechowuje stringi
vector > aaa

w tam mam
aaa 1 bbb ccc ddd ....
bbb 2 bbb ccc ddd ....
ddd 7 bbb ccc ddd ....

na drugiej pozycji mam jakieś liczby

Chciałbym żeby to wszystko było posortowane według liczb na 2 pozycji - bez zmiany innych rzeczy. Da sie coś takiego zrobić? Czego użyć?
  • Najlepsze
  • Wszystkie komentarze
s.....c
s.....c
@MlodyInformatyk: sortowanie z użyciem funkcji lambda (C++11):
#include
int main(){
std::vector > aaa;
std::sort(aaa.begin(), aaa.end(),
[](std::vector& a, std::vector& b){
KrzaQ2
KrzaQ2
  • adult
3
Treść przeznaczona dla osób powyżej 18 roku życia...
s.....a
s.....a
@MlodyInformatyk: da się
s.....c
s.....c
windoo
windoo
@MlodyInformatyk: Wyciągasz 2gi element subwektora (tego wewnetrznego) i sortujesz np bubblesortem elementy nadrzędne.
s.....a
s.....a
@MlodyInformatyk: taki pseudokod w stylu c++, ale nie umiem c++ wiec musisz poprawiać

bool compare(vector a, vector b) {
return int(a[1]) < int(b[1]);
KrzaQ2
@saracenxc: brak trochę constów, ale wygląda ok. (pomijając, ƶe nie sprawdzasz wielkości wewnętrznych wektorów - choć to niekoniecznie musi być błąd)
windoo
windoo
@KrzaQ2: Nie znam bibliotek c++ więc podałem pierwsze rozwiązanie, które mi przyszło na myśl.
s.....c
s.....c
@MlodyInformatyk: Jeśli nie chcesz funkcji lambda, można zrobić tak jak zaproponował @slucham-psa-jak-gra
KrzaQ2
@windoo: ale bubblesort jest gorszy niƶ hitler!
KrzaQ2
@MlodyInformatyk: nie, przyjmuje elementy wektora wektorów - czyli wektory. Inna sprawa, ƶe robi to źle, bo przyjmuje przez kopię. Poza tym w niemoƶliwy sposób castuje string do int. Traktuj jego kod jak pseudokod to będzie ok.
KrzaQ2
@MlodyInformatyk: Lepiej uƶyj wersji z lambdą imo. Ale jeśli chcesz jego wersji to:
1) wskaźnik do funkcji pobierz za pomocą operatoa & (czyli &compare)
2) niech funkcja przyjmuje const referencje
3) int(x[1]) nie ma sensu (jeśli juƶ to int(x[0]), wcześniej źle zrozumiałem jego kod)
KrzaQ2
@MlodyInformatyk: tak, bo on sortuje po drugim znaku nie wiedzieć czemu. Te liczby na 2 pozycji wektora są zawsze 1-cyfrowe?
KrzaQ2
@MlodyInformatyk: dla wektora v:

std::sort(v.begin(), v.end(), [](auto const& l, auto const& r){ return std::stoi(l.at(1)) < std::stoi(r.at(1)); });
jeśli VS nie wspiera polymorphic lambdas:

std::sort(v.begin(), v.end(), [](std::vector const& l, std::vector const& r){ return std::stoi(l.at(1)) < std::stoi(r.at(1)); });
KrzaQ2
@saracenxc: Nawet Hitler nie stosował takiego formatowania kodu :/ (btw, assert z jakiegoś konkretnego powodu zamiast wyjątków?)
s.....c
s.....c
@KrzaQ2: wyjątki są złe - nie lubię wyjątków bo skaczą po kodzie i robi się spaghetti (jak goto).
KrzaQ2
@MlodyInformatyk: W takim razie gdzieś nie masz drugiego elementu wektora
MlodyInformatyk
@slucham-psa-jak-gra: Czego użyć? Jak coś takiego zrobić?
MlodyInformatyk
@slucham-psa-jak-gra: Jakieś hasło na internetach coby wygooglać problem
MlodyInformatyk