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

Tablica dwuwymiarowa

VPS Starter Arubacloud
+1 głos
467 wizyt
pytanie zadane 1 lutego 2021 w C i C++ przez forok Nowicjusz (160 p.)
Hej, mam pytanie jak stworzyć tablice dwuwymiarowa, która w jednej kolumnie zapisze kombinacje liter(40) AB,BC,CD,DE,EF itd a w drugiej kolejne liczby porzadkowe 1,2,3,4,5 itd.

4 odpowiedzi

+1 głos
odpowiedź 2 lutego 2021 przez mokrowski Mędrzec (155,460 p.)
wybrane 2 lutego 2021 przez forok
 
Najlepsza
W tablicy jedno czy wielowymiarowej, może występować tylko jeden typ.

Masz więc następujące wyjścia:

1. Sprowadzić tak string (2-znakowy) jak i indeks do wspólnych danych

2. Stworzyć typ danych obejmujący obydwa pola (string 2-znakowy i index).

W zależności od języka (C lub C++), można to zrobić na wiele sposobów.

Np. 1 pomysł (IMHO taki sobie... ) to użycie typu danych uint16_t i przechowanie w nim 2 znaków oraz indeksu. Tylko będzie trzeba terminować zerem te dwa znaki.

Np. 2 pomysł to... zwykła struktura która będzie przechowywała string i indeks Ja bym osobiście użył wtedy SOA (struct of array)

No a jak C++, to np tablica std::pair<... > lub std::unordered_map . Choć dla tak małego zestawu danych, będą niewydajne i intuicyjnie czuję że przeszukiwanie liniowe może być szybsze.

Jest jeszcze całkiem dobre rozwiązanie... zrobić 2 tablice. W jednej "literki" w drugiej "cyferki" :)
+1 głos
odpowiedź 2 lutego 2021 przez VBService Ekspert (251,250 p.)
edycja 2 lutego 2021 przez VBService
1
komentarz 2 lutego 2021 przez tkz Nałogowiec (42,000 p.)
Stare posty. Wydaje mi się, że rozsądnym byłoby użycie unordered_map z pair. std::unordered_map<unsigned, std::pair<(albo dwa chary albo dwa stringi>> albo std::unordered_map<unsigned, std::string>.
+1 głos
odpowiedź 2 lutego 2021 przez TOM_CPP Pasjonat (22,640 p.)

Podejrzewam że jest to problem typu XY . Jeżeli jednak chcesz utworzyć tablicę zawierającą dane których typy różnią się w kolumnach, to możesz użyć std::variant. ( wymagany standard C++17 )

#include <iostream>
#include <vector>
#include <variant>

using namespace std;

int main()
{
    vector<vector<variant<string,int>>> table = { {"AB",0},{"BC",1},{"CD",2},{"DE",3} };

    for( const auto& row : table )
    {
        for( const auto& element : row )
        {
            visit( []( const auto& i ) { cout << i << ' '; }, element );
        }
        cout << endl;
    }
}

https://godbolt.org/z/3h1Mej

komentarz 2 lutego 2021 przez tkz Nałogowiec (42,000 p.)
Przewaga variant'a nad pair? Moim zdaniem traci to czytelność w tym przypadku.
komentarz 2 lutego 2021 przez TOM_CPP Pasjonat (22,640 p.)

Użycie std::variant pozwala na stworzenie tablicy dwuwymiarowej, która w dowolnych miejscach będzie mogła przechowywać elementy o różnych typach. Dla przykładu tablica zawierająca typ std::string na przekątnej i liczby całkowite w pozostałych miejscach, nie będzie mogła być zaimplementowana przy użyciu std::pair, bez zwiększenia pamięci potrzebnej do jej stworzenia.

komentarz 2 lutego 2021 przez tkz Nałogowiec (42,000 p.)
Niejasno się wyraziłem. Przewaga variant'a nad pair w tym przypadku? Znasz założenie z góry, nie musisz się martwić o różnorodność typów, nie widzę sensu w używaniu varianta. Dodatkowo wypisywanie wydaje mi się po prostu nieczytelne w porównaniu do pair.
komentarz 2 lutego 2021 przez forok Nowicjusz (160 p.)

@TOM_CPP, Moze masz racje z problemem XY :D

niestety musze uzyc jezyka C, wyzej przedstawilem dokladny problem 

komentarz 2 lutego 2021 przez mokrowski Mędrzec (155,460 p.)

@forok, al jak C (i w końcu to zaznaczyłeś), to podam nieco nietypowe ale bardzo efektywne rozwiązanie ale jak uporam się ze swoimi obowiązkami... :)

komentarz 2 lutego 2021 przez mokrowski Mędrzec (155,460 p.)

Bardzo chciałeś to zrobić statycznie, to proszę...

#include <stdio.h>

#define CIRCLE_DATA \
	X("AB", 1) X("BC", 2) X("CD", 3) X("DE", 4) \
	X("EF", 5) X("FG", 6) X("GH", 7) X("HI", 8) \
	X("IJ", 9) X("JK", 10) X("KL", 11) X("LM", 12) \
	X("MN", 13) X("NO", 14) X("OP", 15) X("PR", 16) \
	X("RS", 17) X("ST", 18) X("TU", 19) X("UV", 21) \
	X("UA", 20) X("AC", 21) X("BD", 22) X("CE", 23) \
	X("DF", 24) X("EG", 25) X("FH", 26) X("GI", 27) \
	X("HJ", 28) X("IK", 29) X("JL", 30) X("KM", 31) \
	X("LN", 32) X("MO", 33) X("NP", 34) X("OR", 35) \
	X("PS", 36) X("RT", 37) X("SU", 38) X("TA", 39) \
	X("UB", 40)

#define X(name, index) name, 
static const char * names[] = { CIRCLE_DATA };
#undef X

#define X(name, index) index,
static const int indexes[] = { CIRCLE_DATA };

#define ARRAY_SIZE(array) \
	(sizeof(array) / sizeof(*array))

int main(void) {
	for(size_t i = 0; i < ARRAY_SIZE(names); ++i) {
		printf("name = |%s|, index = %d\n", names[i], indexes[i]);
	}
}

Osobiście zrobił bym to jednak "naliczając tablice".

PS. Co z "Q" ? Na jednym z przykładów jest a na rysunku nie ma?

0 głosów
odpowiedź 1 lutego 2021 przez j23 Mędrzec (194,920 p.)
const char* tab[] = { 
    "AB", "BC", "CD", "DE", "EF", "FG", "GH", "HI", 
    "IJ", "JK", "KL", "LM", "MN", "NO", "OP", "PQ", 
    "QR", "RS", "ST", "TU", "UV", "VW", "WX", "XY", 
    "YZ" 
};

Liczb porządkowych nie ma, bo indeks jest taką liczbą.

3
komentarz 1 lutego 2021 przez manjaro Nałogowiec (37,390 p.)
Ale chyba nie o to pytał autor? A co jeśli będzie sortował tablicę?
komentarz 2 lutego 2021 przez forok Nowicjusz (160 p.)

@j23, Chodzi o program, który bedzie po przyjeciu od uzytwkonika ciagu znakow, wydawal ciag liczb wczesniej przypozadkowanych wedlug wzoru ponizej :) Moge w sumie stworzyc druga tablice ktora bedzie przechowywac liczby i przyrownac do siebie elementy 0=0 1=1 itp tylko pytanie jak :p (W gre wchodzi tylko jezyk C)

komentarz 2 lutego 2021 przez manjaro Nałogowiec (37,390 p.)
Zrób to obiektowo, najprościej będzie. Albo na dwóch tablicach. Niestety C++ jest bardzo upośledzony do takich zadań.

Podobne pytania

0 głosów
1 odpowiedź 330 wizyt
0 głosów
2 odpowiedzi 463 wizyt
0 głosów
1 odpowiedź 763 wizyt

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...