• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie powtarzających się elementów w nieuporządkowanym zbiorze

VPS Starter Arubacloud
0 głosów
3,244 wizyt
pytanie zadane 23 kwietnia 2017 w C i C++ przez vega Użytkownik (510 p.)

Cześć! Chcę napisać program, który usunie z nieposortowanej jednowymiarowej tablicy powtarzające się elementy, tablica nie może zostać posortowana. Mogłabym prosić o jakieś wskazówki? laugh

komentarz 23 kwietnia 2017 przez mokrowski Mędrzec (156,220 p.)
C czy C++? Wolę się upewnić.
komentarz 23 kwietnia 2017 przez vega Użytkownik (510 p.)
c++
komentarz 23 kwietnia 2017 przez Shiro Stary wyjadacz (10,300 p.)
Ja bym po prostu zrobił pętlę w pętli, które by sprawdzały czy dany element już wystąpił.

4 odpowiedzi

+1 głos
odpowiedź 23 kwietnia 2017 przez mokrowski Mędrzec (156,220 p.)

 

Największa trudność w tym rozwiązaniu to brak możliwości posortowania.

Jeśli pytasz o wskazówki to:

1. Zadeklaruj kontener unordered_map

2. Przeglądaj element po elemencie podanej tablicy.

2. Inkrementuj licznik dla danego elementu w unordered_map.

3. Usuń wszystkie elementy występujące w unordered_map z licznikiem większym niż 1 z tablicy.

Poniżej przykład jeśli nie poradzisz sobie sam:

#include <unordered_map>
#include <iostream>

template<typename Iterator>
void showTable(const Iterator first, const Iterator last) {
    for(auto it = first; it != last; ++it) {
        std::cout << *it << ' ';
    }
    std::cout << '\n';
}

template<typename Iterator>
auto countElements(const Iterator first, const Iterator last) {
    std::unordered_map<int, size_t> valuesMap;

    std::for_each(first, last, [&](int value) { ++valuesMap[value];});

    return valuesMap;
}

int main() {
    int table[] = { 10, 33, 26, 10, 54, 66, 33, 12, 54, 1, 7 };
    auto first = std::cbegin(table);
    auto last = std::cend(table);

    std::cout << "Podana tabela    : ";
    showTable(first, last);

    auto valuesMap = countElements(first, last);

    // Tu masz zasadniczy algorytm usunięcia... 
    auto endIter = std::remove_if(std::begin(table), std::end(table),
            [&valuesMap](int value) {
                return valuesMap[value] > 1 ? true: false;
    });

    std::cout << "Elementy unikalne: ";
    showTable(std::begin(table), endIter);
}

 

komentarz 23 kwietnia 2017 przez j23 Mędrzec (195,220 p.)

Znowu muszę uprościć ;)

	vector<int> v = { 10, 33, 26, 10, 54, 66, 33, 12, 54, 1, 7 };
	
	set<int> s;
		
	auto it = remove_if(v.begin(), v.end(), [&s](int i) 
				{  
					auto it = s.insert(i);
					return !it.second;
				} );
	
	v.erase(it, v.end());
	
	for(int i : v)
		cout << i << '\n';

 

1
komentarz 23 kwietnia 2017 przez mokrowski Mędrzec (156,220 p.)
edycja 23 kwietnia 2017 przez mokrowski

1. no... tablica

2. Po co sortujesz set?

3. Na tablicy nie ma erase() :-/

4. No weź się wysil i jak poprawiasz to nie "wywalaj jelit w main()" tylko napisz/popraw funkcję.. :-)

5. I na koniec sprawdź czy to działa. Np. czy pojawia się 10, 33..  na liście wyników.. 

komentarz 23 kwietnia 2017 przez j23 Mędrzec (195,220 p.)
  1.  tablica/vector whatever...
  2. zapomniałem o unordered_set...
  3. patrz 1.
  4. main tam nie widzę ;)
  5. pojawia się ;)
1
komentarz 23 kwietnia 2017 przez mokrowski Mędrzec (156,220 p.)
Ad. 5. No .. a mają się nie pojawiać. Przeczytaj wymagania:-) Ergo Twoje rozwiązanie jest błędne.
komentarz 23 kwietnia 2017 przez j23 Mędrzec (195,220 p.)

Czy ja wiem... "usunie z (...) tablicy powtarzające się elementy" można interpretować różnie. IMO chodzi o duplikaty.

0 głosów
odpowiedź 23 kwietnia 2017 przez niezalogowany
Tablica pomocnicza do której wrzucasz unikalne wartości, jeżeli jakiś element już się w niej znajduje no to go susuwasz
komentarz 23 kwietnia 2017 przez vega Użytkownik (510 p.)
Usuwam z tej głównej tablicy?
komentarz 23 kwietnia 2017 przez niezalogowany
Tak
0 głosów
odpowiedź 23 kwietnia 2017 przez j23 Mędrzec (195,220 p.)
edycja 23 kwietnia 2017 przez j23

Jakiś czas temu był podobny temat na tym forum. Podałem kod w wykorzystaniem mapy i vektora. Poszukaj...

 

--- dodane ---

Tu ---> https://forum.pasja-informatyki.pl/243017/kilka-operacji-na-tablicach-w-c?show=243077#a243077

Zamiast mapy użyj kontenera set.

–1 głos
odpowiedź 23 kwietnia 2017 przez Ehlert Ekspert (213,150 p.)

Tutaj masz fajny sposób jak zrobić to szybko i z pomocą std. 

komentarz 23 kwietnia 2017 przez mokrowski Mędrzec (156,220 p.)
No tak, ale zwróć uwagę że kontener ma być nie posortowany także odpada to rozwiązanie.

Podobne pytania

0 głosów
1 odpowiedź 5,477 wizyt
pytanie zadane 8 listopada 2016 w JavaScript przez MatiiTv Gaduła (3,800 p.)
+1 głos
2 odpowiedzi 423 wizyt
0 głosów
1 odpowiedź 355 wizyt
pytanie zadane 26 września 2015 w C# przez jegor377 Stary wyjadacz (13,230 p.)

92,770 zapytań

141,695 odpowiedzi

320,519 komentarzy

62,107 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...