Tworzenie listy stringów na podstawie tablic.

0

Witam, otóż chcę zrobić taki program, który będzie miał różne tablice stringów, np:

string tablica1[5]={"wyraz1", "wyraz2", "wyraz3"};
string tablica2[5]={"wyraz4", "wyraz5", "wyraz6"};
string tablica3[5]={"wyraz7", "wyraz8", "wyraz9"};

Oraz przy okazji jak mam:

string nazwa[5];
    nazwa[1] = "teskt1";
    nazwa[0] = "tekst0";
    
    
    
    for(int i=0; i<100; i++)
    {
        cout << nazwa[i];
    }

To jak zrobić, aby pod zmienną "i" w tym miejscu:

for(int i=0; i<100; i++)

przypisana została wartość, która znajduje się w tablicy, mam na myśli to:

string nazwa[5];

Lecz, żebym nie musiał tego robić ręcznie, tylko żeby za każdym razem ta wartość była pobierana automatycznie.

Oraz jak zrobić, aby było tak, że wpiszę z klawiatury "jakieś_słowo" i będę miał:

 for(int i=0; i<100; i++)
    {
        cout << jakieś_słowo[i];
    }

Tzn. mam na myśli to, że "jakieś_słowo" ma być wskaźnikiem na konkretną tablicę. Że jak wpiszę z klawiatury "tablica2", to będę wtedy miał tak jakby:

 for(int i=0; i<5; i++)
    {
        cout << tablica2[i];
    }
1

Ad.1. Napisz po ludzku - bo nie idzie zrozumieć o co pytasz.
Ad.2. Też nie po ludzku ale da się zrozumieć: for(int i=0;i<sizeof(nazwa)/sizeof(*nazwa);++i)

2

Mam wrażenie, że intencją autora jest zarejestrowanie słów jako komend, które by dodawały inne z góry zdefiniowane wartości do "listy".

Jeśli tak jest to można do tego zastosować mapę:

unordered_map<string,vector<string>> komendy = {
    {"slowo1", {"wyraz1", "wyraz2", "wyraz3"}},
    {"slowo2", {"wyraz4", "wyraz5", "wyraz6"}}
};

Przykład użycia: http://ideone.com/2Lp5Bs

0
_13th_Dragon napisał(a):

Ad.1. Napisz po ludzku - bo nie idzie zrozumieć o co pytasz.
Ad.2. Też nie po ludzku ale da się zrozumieć: for(int i=0;i<sizeof(nazwa)/sizeof(*nazwa);++i)

Przepraszam że tak zagmatwanie to napisałem. Już zedytowałem post, aby było bardziej przejrzyście.

0
kq napisał(a):

Mam wrażenie, że intencją autora jest zarejestrowanie słów jako komend, które by dodawały inne z góry zdefiniowane wartości do "listy".

Jeśli tak jest to można do tego zastosować mapę:

unordered_map<string,vector<string>> komendy = {
    {"slowo1", {"wyraz1", "wyraz2", "wyraz3"}},
    {"slowo2", {"wyraz4", "wyraz5", "wyraz6"}}
};

Przykład użycia: http://ideone.com/2Lp5Bs

A czy można to wykonać w jakiś inny sposób? Ponieważ w Devie wyskakuje mi:

#error This file requires compiler and library support for the \
ISO C++ 2011 standard. This support is currently experimental, and must be \
enabled with the -std=c++11 or -std=gnu++11 compiler options.

Zaś w Visualu 2012 to już mi wyskakuje ogromna ilość błędów (ale tam często mam tak, że w Devie kod działa, a w Visualu już nie). Albo może ktoś polecić jakiś inny kompilator?

2

Dodaj do opcji kompilacji -std=c++11 i będzie działało.

Jeśli to niemożliwe, to korzystanie z dobrodziejstw C++11 odpada i będziesz musiał inaczej zainicjalizować mapę (i użyć map zamiast unordered_map)

0
kq napisał(a):

Dodaj do opcji kompilacji -std=c++11 i będzie działało.

Jeśli to niemożliwe, to korzystanie z dobrodziejstw C++11 odpada i będziesz musiał inaczej zainicjalizować mapę (i użyć map zamiast unordered_map)

Serdecznie dziękuję, już wszystko działa poprawnie. A od razu chciałem się zapytać czy w tym typie listy da się jakoś zrobić, aby element z tablicy, który już znajduje się na liście, nie dodawał się? Bo jak robiłem kiedyś listę jednokierunkową na typach "int", to miałem tak:

int add( el *&node, int key )
{
     if( node == NULL )
     {
         node = new el;
         node->key = key;
         node->next = NULL;
         return 0;
     }   
     else
     {    
          if( node->key == key )
          {
              cout << "element already exists!" << endl;
              return 1;
          }
          add( node->next, key );
     }
}

Ale za bardzo nie wiem jak to zrobić, korzystając z C++11.

Dokładniej mam na myśli coś takiego:

unordered_map<string,vector<string>> komendy = {
{"slowo1", {"wyraz1", "wyraz2", "wyraz3"}},
{"slowo2", {"wyraz4", "wyraz1", "wyraz6"}}
};

I np. jak wpiszę "słowo2", a potem "słowo1", to chciałbym, aby wyświetlało się: "wyraz4", "wyraz1", "wyraz6", "wyraz2", "wyraz3".

1

Jeśli nie zależy Ci na zachowaniu kolejności to użyj kontenera unordered_set (lub set), w przeciwnym wypadku w miejscu dodawania musisz sprawdzić, czy lista już zawiera taki element.

Wersja niezachowująca kolejności: http://ideone.com/gKZUJX

Wersja zachowująca kolejność: http://ideone.com/UWGQhD

0
kq napisał(a):

Jeśli nie zależy Ci na zachowaniu kolejności to użyj kontenera unordered_set (lub set), w przeciwnym wypadku w miejscu dodawania musisz sprawdzić, czy lista już zawiera taki element.

Wersja niezachowująca kolejności: http://ideone.com/gKZUJX

Wersja zachowująca kolejność: http://ideone.com/UWGQhD

Serdecznie dziękuję za pomoc :)

Oraz mam jeszcze jedno, ostatnie (chyba :P) pytanie. Czy można samemu przypisać coś do tablicy, czy to musi być z góry założone? Bo chciałem zrobić coś takiego (program ogólnie robię jako ułatwienie sobie gry :P):

unordered_map<string,vector<string>> komendy = {
{"Bog_Raider", {"      <paladin-armor>\n        <Id>8063</Id>\n        <Destination>02</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </paladin-armor>\n", "      <springsprout-rod>\n        <Id>8084</Id>\n        <Destination>02</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </springsprout-rod>\n", "      <belted-cape>\n        <Id>8044</Id>\n        <Destination>02</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </belted-cape>\n"}},
{"slowo2", {"wyraz4", "wyraz1", "wyraz6"}}
};

I czy można zrobić, aby była tutaj przypisana zmienna wymyślona przez nas? Np. coś takiego:

string zmienna;
cout >> "Podaj zmienna: ";
cin << zmienna;

unordered_map<string,vector<string>> komendy = {
{"Bog_Raider", {"      <paladin-armor>\n        <Id>8063</Id>\n        <Destination>" >> zmienna >> "</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </paladin-armor>\n", "      <springsprout-rod>\n        <Id>8084</Id>\n        <Destination>02</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </springsprout-rod>\n", "      <belted-cape>\n        <Id>8044</Id>\n        <Destination>02</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </belted-cape>\n"}},
{"slowo2", {"wyraz4", "wyraz1", "wyraz6"}}
};

Tylko, że jak próbuję robić, tak jak napisałem, to mam błąd. Dlatego chciałem się zapytać czy istnieje jakiś sposób na zrobienie tego.

0

Otóż mam jeszcze jedno pytanie. Czy można zrobić w tej wersji:

http://ideone.com/UWGQhD

tak, żeby była możliwość powtórzeń konkretnej zmiennej? Np. chodzi mi o coś takiego:

string item;
cin >> item;

unordered_map<string,vector<string>> komendy = {
{"Bog_Raider", {"      <paladin-armor>\n        <Id>8063</Id>\n        <Destination>", item, "</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </paladin-armor>\n", "      <springsprout-rod>\n        <Id>8084</Id>\n        <Destination>", item, "</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </springsprout-rod>\n", "      <belted-cape>\n        <Id>8044</Id>\n        <Destination>", item, "</Destination>\n        <AlarmOn>No Alarm</AlarmOn>\n      </belted-cape>\n"}},
{"slowo2", {"wyraz4", "wyraz1", "wyraz6"}},
{"slowo3", {"wyraz5", "wyraz7", "wyraz8"}},
{"slowo4", {"wyraz1", "wyraz9", "wyraz8"}}
};

Żeby w tym kodzie:

case 'd':
            cout << "Add." << endl;
                
                        while(cin >> in){
                        auto it = komendy.find(in);
                        if(it == end(komendy)) continue;
 
                        for(string const& s : it->second){
                        auto znaleziono = find(begin(lista),end(lista),s);
                        if(znaleziono == end(lista)) lista.push_back(s);
                        }
                        break;
                        }
                
                break;

była możliwość wielokrotnego powtarzania zmiennej "item", a jedynie nie powtarzania tego, co jest w cudzysłowach, np. żeby "wyraz1" pojawiał się tylko raz. Żeby ta możliwość powtarzania była tylko dla z góry założonej zmiennej.

@Edit

Próbowałem tak:

case 'd':
            cout << "Add." << endl;
                
                        while(cin >> in){
                        auto it = komendy.find(in);
                        if(it == end(komendy)) continue;
 
                         //lista.insert(end(lista),begin(it->second),end(it->second));
                         
                        for(string const& s : it->second){
                            if(s == item)
                            {
                                lista.push_back(s);
                            }
                        auto znaleziono = find(begin(lista),end(lista),s);
                        if(znaleziono == end(lista)) lista.push_back(s);
                        //if(znaleziono == end(lista)) lista.insert(end(lista),begin(it->second),end(it->second));
                        }
                        break;
                        }
                
                break;

Ale wtedy jak za item wstawię "1" i wpiszę dwa razy "Bog_Raider", to pojawiają mi się 3 dodatkowe jedynki na końcu :/

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