[c++] operacje na stringach i STL

0

Po serii roznych zapisow do pliku, odczytow doszedlem do takiego wydaje sie banalnego momentu i tu cos nie tak (informacje w komentarzach)

   while (cal[i])  //cal to string z odczytanym ciagiem zer i jedynek
    {
        flaga = true;
        dod +=cal[i];  //dod to zwykly string
        for (int j=0; j< liczba_liter; j++)
        {
            if (dod == _kod[j])  //porownuje biezace dod ze wszystkimi mozliwymi kombinacjami zer i jedynek (wektor stringow _kod)
            {
                temp_k+= _znak[j];  //_znak[j] to literka odpowiadajaca ciagowi _kod[i]
                flaga = false;
                break;
            }

        }
        if (flaga == false)
            dod.clear();

        ++i;

    } 

I przy przykladowym pliku zamiast slowa Lubie, wypisane jest 6 czarnych pytajnikow, co tu w kodzie jest nie tak ? (te wszystkie stringi dostarczone do petli sa na bank ok)

z gory dzieki :)

0

A co to ma robić? Dałbyś coś co da się skompilować, bo nikt nie zgadnie co masz w tych wszystkich zmiennych, jakiego pliku i co wypisujesz.

0

tylko to jest jakies 1000 linii kodu, w tym momencie odczytalem bitowo zapisany plik z kodem 0 i 1 do stringu "cal" i porownuje go z tablica wzorow roznych kombinacji zer i jedynek (z algo Huffmana)...

0

chyba znalazłem problem, ma pytanie jak porownac cos takiego :)

string a;

vector<string> k[200];

jak dokonac czegos takiego:

a=k[1]

lub

sprawdzenia a==k[2]

??

0

w sensie, koniecznie przeciazenie operatora, czy da sie szybciej ?

0

Ale co przeciążać? To już jest przeciążone.

0

ale wyrzuca kompilator blad, ze brak operatora w tych linjkach, dlaczego ?

0

std::vectorstd::string kody[300];

while (FILE.get(z))

...
kody[i].push_back(temp);

...

 std::string dod;
 bool flaga = true;
while (cal[i])
{
    flaga = true;
    dod +=cal[i];
    for (int j=0; j< liczba_liter; j++)
    {
        
     
        if (dod == kody[j])    //tutaj blad:    error: no match for ‘operator==’ in ‘dod == kody[j]’     dlaczego ? 
        {
            temp_k+= znaki[j];
            flaga = false;
            break;
        }

    }
    if (flaga == false)
        dod.clear();

    ++i;

}
0
if (dod == kody[j])    //tutaj blad:    error: no match for ‘operator==’ in ‘dod == kody[j]’     dlaczego ?

bo dod

 jest <code noframe>string

a kody[j]

 jest <code noframe>vector<‌string>

.

0

No taki powod mi przychodzil na mysl ;)

Ale jest jakis prosty sposob, aby to wykonac, bo cos nic mi do glowy nie przychodzi, a przeciazyc operatora tez sie chyba nie da, bo nie mam dostepu do klas string lub vector, wiec jak go zaprzyjaznic ?

0

Ale w jaki sposób chcesz porównać stringa z vectorem stringów?(może Ci chodziło z tym vectorem o tablicę stringów a nie o tablicę vectorów stringów)

0

no chce porownac string, z konkretny stringiem z wektora stringow (o danym indeksie)

0

To chyba nie rozkminiłeś dokładnie jak działają wektory.
Pisząc:

vector<string> k[200]; 

Tworzysz 200 wektorów. W tym przypadku np. k[0][0] to jest pierwszy string z pierwszego wectora. Z kolei:

vector<string> k(200); 

Tworzy jeden wektor, który zawiera 200 stringów i tu np. pierwszym stringiem jest k[0];

0

Dzieki wielkie, dziala teraz :)

Ale wiesz moze po co tak zrobiono to z tymi wektorami, jaki to ma sens przktyczny ?

A czy przy wektorach typow podstawowych, tez sa takie roznice pomiedzy [] i () ?

0

Tak. Jak tworzysz wektor, wywoływany jest konstruktor - funkcja która tworzy obiekt, ale ona też przyjmuje argumenty, które można podawać w () - w tym wypadku argument to ilość obiektów w wektorze.

0

ok,

taka poprawka
vector<string> a[300];

dod == a[j][0]
to dziala ok,

ale to:

vector<string> a(300)
a.push_back(...);

dod == a[j] - to powoduje segmentation, dlaczego ?

0

A czy przy wektorach typow podstawowych, tez sa takie roznice pomiedzy [] i () ?

nawiasy [] oznaczają po prostu tablicę, więc jak

int tab[10]

to tablica 10 intów,

string tab[10]

to tablica 10 stringów, to

vector<string> tab[10]

to tablica 10 zmiennych typu vector<string>.

0
kart napisał(a)

ok,

taka poprawka
vector<string> a[300];

dod == a[j][0]
to dziala ok,

ale to:

vector<string> a(300)
a.push_back(...);

dod == a[j] - to powoduje segmentation, dlaczego ?

Widocznie wychodzisz poza tablicę(j jest za duże).

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