Sortowanie tablic 2-wymiarowej stringów

0

Witam,
Potrzebuje posortować tablicę dwuwymiarową, która zawiera stringi (wartości liczbowe ale w postaci string - zaczytane w pliku csv).
Sortowanie ma być po przedostatnim wierszu, od najmniejszej wartości do największej.

is_integer - funkcja konwertuje stringi na double
rozmiar_danych_kolumny - ilość kolumn w pliku csv
rozmiar_danych_wiersze - ilość wierszy w pliku csv

for (int Z = 1; Z < rozmiar_danych_kolumny; Z++) {
	for (int X = 1; X < rozmiar_danych_kolumny; X++) {

		if (is_integer(tablica_dane[rozmiar_danych_wiersze - 2,X]) > is_integer(tablica_dane[rozmiar_danych_wiersze - 2,Z])) {
			for (int Y = 0; Y < rozmiar_danych_wiersze; Y++) {
				tablica_tmp_wiersze[Y] = tablica_dane[Y,X];
				tablica_dane[Y,X] = tablica_dane[Y,Z];
				tablica_dane[Y,Z] = tablica_tmp_wiersze[Y];
			}

		}
	}
}

i co do zasady kod działa poprawnie, ale przy dużych plikach wykonuje się BARDZO długo...
Jak można by przyspieszyć proces? Myślałem żeby może najpierw przekonwertować całą tablice_dane na wartości liczbowe i dopiero zacząć sortowanie ale nie wiem czy to coś pomoże?

4

is_integer - funkcja konwertuje stringi na double

Bardzo nieintuicyjna nazwa, sugerująca zupełnie coś innego.

Co oznacza zapis tablica_dane[Y,Z] w kontekście języka C++? Czyżby był zdefiniowany własny operator,

Jeżeli zależy Ci na szybkości to tablica powinna zawierać liczby zamiast stringów.
Można to zrobić w taki sposób:

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>

using namespace std;

int main()
{
    list<vector<double>> data = {
                                   { 1.5 , 8.3 ,  1.2 , 1 } ,
                                   { 0.4 , 8.8 ,  4.2 , 2 } ,
                                   { 6.1 , 2.3 ,  0.2 , 3 } ,
                                   { 4.5 , 1.3 ,  7.2 , 4 } ,
                                   { 9.9 , 0.3 ,  2.1 , 5 }
                                };

   data.sort( [i = begin(data)->size()-2]( auto& row1 , auto& row2 ){ return row1[i]>row2[i]; } );

   for( const auto& row : data )
   {
       for( const auto& element : row )
       {
           cout << element << ' ';
       }
       cout << endl;
   }
}

https://godbolt.org/z/e9bvaE

1
TomaszLiMoon napisał(a):

Co oznacza zapis tablica_dane[Y,Z] w kontekście języka C++? Czyżby był zdefiniowany własny operator,

Nawet jeśli, to to jest w cpp20 P1161R3 Deprecate uses of the comma operator in subscripting expressions

0

@TomaszLiMoon: nazwa pozornie myląca, bo ponieważ pobieram dane z pliku csv to w funkcji zanim dokonam konwersji sprawdzam też czy wartość ma sens matematyczny i odpowiedni format.

tablica_dane[Y,Z] - zapis z vc++ :)

Zmieniłem odczyt z pliku i od razu ładuje wszystko do tablicy double co dało poprawę z kilkunasty minut na plik na kilka sekund - także efekt osiągnięty.
Dzięki

2

Nie, ta nazwa jest w pełni myląca. Sugeruje, że odpowiada tylko za weryfikację i zwraca wartość logiczną, a robi coś zupełnie innego.

0
the_d napisał(a):

tablica_dane[Y,Z] - zapis z vc++ :)

To jest raczej C++CLI czyli niestandardowy C++, który ma służyć jako pomost do .net-a (C#).

1 użytkowników online, w tym zalogowanych: 0, gości: 1