Grupowanie danych liczbowych w tablicy dwuwymiarowej

0

Witam,

Jak najprościej zgrupować dane w tablicy dwuwymiarowej gdzie kryterium jest w pierwszej kolumnie tablicy?

Przykład:

Jest taka tablica

A,1,3,5,8,9
B,1,3,5,8,9
A,5,4,6,9,0

Ponieważ pierwszy wiersz ma taki sam znak A jak trzeci wiersz to należy w pierwszym wierszu podać sumę dwóch wierszy A a wiersz który został dodany wyzerować
Czyli wynik będzie wyglądał tak:

A,6,7,11,17,9
B,1,3,5,8,9
A,0,0,0,0,0

1

Oczekujesz pomocy czy rozwiązania? Jeśli pomocy, pokaż kod, który już masz. Jeśli rozwiązania- dział "Ogłoszenia drobne".

5
	struct Arr {
		char desc;
		array<int,5> data;
	};

	
	vector<Arr> foo = {
		{ 'A', {{1,3,5,8,9}} },
		{ 'B', {{1,3,5,8,9}} },
		{ 'A', {{5,4,6,9,0}} }
	};

	auto cmp = [](auto const& l, auto const& r){
		return l.desc < r.desc;
	};

	sort(foo.begin(), foo.end(), cmp);

	auto lo = foo.begin();
	decltype(lo) up;

	vector<Arr> results;

	do{
		up = upper_bound(lo, foo.end(), *lo, cmp);
		results.push_back(*lo);

		for_each(next(lo), up, [&](auto const& el){
			auto& dest = results.back();
			transform(begin(dest.data), end(dest.data), begin(el.data), begin(dest.data), plus<>{});
		});

		lo = up;
	}while(up != foo.end());

http://melpon.org/wandbox/permlink/UetAEjFz4BxmnUor

Nie jestem w zupełności zadowolony z tego rozwiązania :/ To powinno być proste.

@Phestek: imo to raczej fajne pytanie z rodziny "wiem jak to zrobić, ale jak to zrobić fajniej/lepiej?" niż próba uzyskania gotowca. Ale mogę się mylić :)

0

Czyli jednak wszystko sprowadza się do użycia kontenera. Tak myślałem tylko, że nie znam metody którą można by tak ułożyć kontener. Jeśli nie sprawi Ci kłopot opisanie funkcji, których użyłeś to będę Ci wdzięczny . Dziękuję

0
Phestek napisał(a):

Oczekujesz pomocy czy rozwiązania? Jeśli pomocy, pokaż kod, który już masz. Jeśli rozwiązania- dział "Ogłoszenia drobne".

Miałem na myśli podanie kierunku rozwiązania. Z vectorem sobie poradzę może nie w tak spektakularny sposób jak zrobił to kq ale efekt ten sam

3

Algorytmy masz opisane w dokumentacji z fajnymi przykładami, więc nie będę na to tracił czasu. http://en.cppreference.com/w/cpp/algorithm

Ogólna idea jest taka:

  1. sortujesz zewn. tablicę po pierwszej kolumnie (tutaj literka) - sort (do porównania używasz komparatora cmp)
  2. dzielisz zewn. tablicę na części o tej samej literce (upper_bound znajduje pierwszą większą wartość w danym porządku leksykograficznym)
  3. dla każdej części, pierwszy rząd użyj do zainicjalizowania odpowiedzi (push_back do results)
  4. wszystkie pozostałe rzędy zsumuj z rezultatem (for_each i transform dla każdego rzędu)
  5. przenieś lo na początek kolejnego zakresu
0

Dzięki za wyjaśnienie. Czyli tablicę dwuwymiarową sprowadzasz do postaci liniowej czyli jednowymiarowej w vectorze jak dobrze rozumiem chyba że jest jeszcze inaczej?

0
auto cmp = [](auto const& l, auto const& r){
        return l.desc < r.desc;
    }; 

Obecnie standard "chyba" nie pozwala na używanie słowa auto w argumentach funkcji (lambdy), czy jednak można?

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