wybór odpowiedniego pojemnika

0

Witam, tworze program który ma za zadanie:
W zależności od podanej liczby, zapisać wszystkie stany licznika w postaci binarnej;

Mogę łatwo wyliczyć ilość rzędów i kolumn. Problem dotyczy w czym przechowywać te dane.
Mogę próbować jakoś z dynamicznym tworzeniem zwykłych tablicami i wskaźnikami. Ale słyszałem też o pojemnikach które można wykorzystać do takich działać.
Jaki najlepiej zastosować, jeżeli wiem że, rozmiar który raz podam nie ulegnie zmianie, nie bedę potrzebwoac wiecej poamięci na przechowanie dodatkowych obiektów.
Jaki tym pojemników nadawałbym się do tego prostego zadania ?

 class StateTable
{
    int column;
    int row;

    public:
        StateTable();
        StateTable(int Row, int Column);
};
2

"W zależności od podanej liczby, zapisać wszystkie stany licznika w postaci binarnej;"

troche nie rozumiem tego,

ale mozesz zawsze uzyc bitset'a

http://www.cplusplus.com/reference/bitset/bitset/bitset/
i sie nie bawic w zmiane na dwojkowy system.

0

"W zależności od podanej liczby, zapisać wszystkie stany licznika w postaci binarnej;"

Wybiore licznik ktory posiada przykładowo 5 stanów. Czyli liczy od 0-4. Kazdy stan muszę zakodować w Tablicy. 5 stanów zapiszę na 3 bitach. w taki sposób tworzę tablicę Binarną:
000
001
010
011
100

Na podstawie tej tablicy chce potem porównywać zmianę stanów na poszczególnych bitach względem danego przerzutnika :) . Do zamiany z 10 na 2 napisałem sam sobie prostą funkcje, ale fajnie że podesłałeś mi link do tego bitset'a, zaraz sie z nim bliżej zapoznam.
Chodziło mi o to w czym te dane przechowywać. Bawić się z dynamiczna alokacja zwykłych tablic czy zastosować jakiś pojemnik
Pozdrawiam!

1

Nie do końca rozumiem co chcesz uzyskać. W związku z tym trochę się będę domyślał :-)
Chyba do tego zadania wystarczy prosty kontener vector<unsigned> lub jeśli wiesz jakie jest ograniczenie ilości bitów vector<uint32_t>. Gdzie typ uint32_t zamienisz na odpowiednio długi w reprezentacji bitowej (tak aby pomieścić ilość bitów licznika).
Znajdziesz je w <cstdint> lub <stdint.h>.
Następnie (jak rozumiem), generujesz stany licznika jako liczby od 0 do n-1, gdzie n to całkowita ilość stanów.
Zmianę stanu danego przerzutnika wyciągniesz poprzez proste maskowanie.

// Jeśli p to numer przerzutnika liczony od 0 to bit stanu...
bit = (value_from_container & (1 << p)) >> p;

.. i myślę że nie ma co wydziwiać :-) Kontener vector z swoim push_back(), resize() i innymi metodami powinien wystarczyć :-)

0

W takim razie do zrealizowania wszystkich stanów licznika potrzebuje wektor wektorów.
Jak w takim razie stworzyc wymiary takich wektorow? Oczywiscie uzywajac funkcji push_back(dana), tylko nie wiem jak to moze wygladac w przypadku wektora wektorow
vector< vector<bool> > binVec;
Tak rozwiazywalem taki problem na tablicach :)

int w=16,k=4;
tab[w][k];
for(int i=0; i<w; i++)
    for(int j=0; j<k ; j++)
        tab[n] =1; 

Pozdrawiam

2

A po co? Przecież liczniki z ilością stanów do 256 zapiszesz do zmiennej uint8_t a z ilością stanów 65536 w uint16_t. Wyciągnięcie stanu przerzutnika to maskowanie. W jakim celu chcesz mieć 2 wymiar tablicy (a lepiej wektora).
Jeśli jednak jest (jakikolwiek) powód posiadania 2 wymiarów w kontenerze, radzę vector z vector'ami. Mniej możliwości popełnienia błędów niż w w "surowej tablicy". Tablice znane z C mają sens w kodzie krytycznym czasowo i/lub niskopoziomowym.

0

To może od początku. Najbardziej zalezy mi aby na podstawie wprowadzonych danych(ilosci stanow max 16) program wygenerował graficzne reprezentacje tablic ( biblioteka SFML), aby pokazac je wizualnie uzytkownikowi. Na początku sama zakodowaną binarnie tablice stanow licznika. Na razie zostawmy maskowanie w spokoju, przyda się potem :D.

user image
Dolaczam tabelke interesuje nas jej 1 czesc :)
Użytkownik wybrał 12 stanów:
Po wstępnych obliczeniach już wiemy, że potrzebujemy 4 przerzutniki. Czyli 12 wierszy i 4 kolumny.
Jeżeli korzystam z vectora z vector'ami to nie wiem jak rozszerzyć je na 12 wierszy i 4 kolumny. Czy jest możliwość rozszerzenia tego funkcja push_back? Jak tak do jak sie dostać to "2 wymiaru".

vector< vector<bool> > binVec;
 
1
vector< vector<bool> > binVec( 12, vector<bool>( 4 ) );

Takie coś stworzy Ci wektor jaki chcesz

darthachill napisał(a):

Jak tak do jak sie dostać to "2 wymiaru".

Tak jak w zwykłych tablicach

binVec[1][2]

drugi wiersz, trzecia kolumna

0

Przepraszam że, nie odpisywałem tyle ale miałem na głowie inne rzeczy :)

Takie coś stworzy Ci wektor jaki chcesz

ok, ale co w przypadku gdy mam klasę i w niej zmienna wektor. Tworzę konstruktor który pobiera 2 argumenty: ilość rzędów i kolumn. I teraz chce ustawić wektor wektorów na takie wymiary :)

class StateTable
{
    vector< vector<bool> >bin;

public:
    StateTable();
    StateTable(int Row, int Column)
{

}; 
  1. Czy mam dynamicznie przydzielić pamięć operatorem new jak w tablicach?
    darthachill napisał(a) 21 minut temu:
    Jak tak do jak sie dostać to "2 wymiaru".


Tak jak w zwykłych tablicach
  1. Miałem na myśli jak się dostać do tego wymiaru w sensie jak dodać nowy element metodą push_back() tego 2 wymiaru :).

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