Wektor Stringów, wklejenie insert

0

Witam szukałem rozwiązania po google i nic nie znalazłem, wandbox zwraca bład fragmentacji. Co ma robić? W określone miejsce wrzucać jakis ciąg znaków, niestety nie działa mimo braku błędu. Nie mam już pomysłu co jest nie tak... Tak wiem zaraz zostanę opieprzony za jakiś mały błąd albo źle zrobioną rzecz ale ucze się nie jestem mistrzem.

Na inpucie cały program ma ciąg znaków zmienić według zasad, skasować nawiasy i plusy a mnożenia zamienić na plusy.

Dodatkowo nie podobają mi się te ify, lepiej zamienić na switcha? I/lub coś innego?

Wrzucam cały kod ze strzałką gdzie jest problem:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void wypisz(vector <string> &tab, int a)
{
    for(int i=0; i<a; i++)
    {
        cout<<tab[i]<<endl;
    }
}

// Usuwanie i zamiana elementow
void dzialanie(vector <string> &tab, int a)
{
    for(int i=0; i<a; i++)
    {
        cout<<tab[i].length()<<endl;
        for(long unsigned int j=0; j<tab[i].length(); j++)
        {
            int dodawania=0, mnozenia=0;
            //Kasowanie nawiasow
            if((tab[i][j]==40)||(tab[i][j]==41))
            {
                tab[i].erase(j,1);
                j--;
            }
            //Kasowanie plusow
            if(tab[i][j]==43)
            {
                tab[i].erase(j,1);
                j--;
                dodawania++;
            }
            //Kasowanie i zamiana mnozen
            if(tab[i][j]==42)
            {
                tab[i].erase(j,1);

    =>        auto it=tab.begin() + j;
                tab.insert( it, "z");
                j--;
                mnozenia++;
            }
        }
    }
}


int main()
{
    int ile;
    cin>>ile;
    while(ile>100)
    {
        cin>>ile;
    }

    vector <string> tab;

    for(int i=0; i<ile; i++)
    {
        string tekst;
        cin>>tekst;
        while(tekst.length()>400)
        {
            cin>>tekst;
        }
        tab.push_back(tekst);
    }

    dzialanie(tab, ile);

    wypisz(tab, ile);
    return 0;
}
2
    =>        auto it=tab.begin() + j;
                tab.insert( it, "z");

To iterator zewnętrznej tablicy (wektora), a nie stringa. Chciałeś użyć tab[i]

Ogółem widzę kilka rzeczy, które konicznie powinieneś zmienić:

  1. Funkcja wypełniająca polecenie powinna działać na jednym stringu i być dla każdego wywoływana.
  2. Jak masz std::vector to absolutnie bezsensowne jest przekazywanie jego wielkości przez drugi parametr. Od tego jest vector<>::size() albo std::size()
  3. C++ ma for_each i ranged for. "stary" for ma tutaj sens dla chodzenia po stringu, ale nie po wektorze (pomijając pkt 1).
0

Czy to nie spowoduje niepotrzebnego spowolnienia za kazdym razem przekazywac wektor? Podpunkt drugi zrobilem, niestety po zmianie na tab[i] wylatuje tylko error.

Z for_each się męczę ale zrobię to na tym, nowośc dla mnie więc mam problemy ale mam nadzieję że jakoś rozwiążę.

1

Pewnie chcesz wstawiać 'z'. Swoją drogą, zapomniałem o punkcie 4: skąd pomysł na te magiczne stałe? Dlaczego nie użyjesz '(', ')' itd?

Jak przekazujesz referencję do stringa to nie będzie żadnego spowolnienia.

0

Dziękuje krzaku, wrzucam aktualny kod coś jeszcze do poprawy?

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

void wypisz(vector <string> &tab, int a)
{
    for(int i=0; i<a; i++)
    {
        cout<<tab[i]<<endl;
    }
}

// Usuwanie i zamiana elementow
void dzialanie(string &tab)
{
    for(long unsigned int i=0; i<tab.size(); i++)
    {
        if((tab[i]=='(')||(tab[i]==')'))
        {
            tab.erase(i, 1);
            i--;
        }
        if(tab[i]=='+')
        {
            tab.erase(i, 1);
            i--;
        }
        if(tab[i]=='*')
        {
            tab.erase(i, 1);
            tab.insert(tab.begin() +i, 'z');
        }
    }
}


int main()
{
    int ile;
    cin>>ile;
    while(ile>100)
    {
        cin>>ile;
    }

    vector <string> tab;

    for(int i=0; i<ile; i++)
    {
        string tekst;
        cin>>tekst;
        while(tekst.length()>400)
        {
            cin>>tekst;
        }

        tab.push_back(tekst);
    }

    for_each(tab.begin(), tab.end(), dzialanie);

    wypisz(tab, ile);
    return 0;
}

0

Wygląda ok. Zastanowiłbym się ciut nad formatowaniem kodu, ale tragedii nie ma - indentacja jest spójna, więc jest ok.

Aha: i size_t do typów porównywanych z size_t (tutaj: i)

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