wczytywanie tablicy do vectora

wczytywanie tablicy do vectora
0

Czy ktoś mógłby mi podpowiedzieć, gdzie robię błąd i dlaczego to mi nie działa?

Kopiuj
 
#include <iostream>
#include <vector>

using namespace std;

void a( string liczby[] )
{
    vector < string > dane(liczby, liczby+sizeof(liczby)/sizeof(string));
    for( int i = 0; i <sizeof(liczby)/sizeof(string); i++ )
    {
    dane[i]=liczby[i];
    cout<<dane[i];
    }

}

int main ()

{
   string moje_liczby[] = { "16", "2", "77" };
    a( moje_liczby );

  return 0;
}


kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:5 dni
  • Lokalizacja:Łódź
  • Postów:1402
3

sizeof(liczby) da ci rozmiar wskaźnika, a sizeof(string) wielkość będzie podobna do wielkości wskaźnika - w zależności od implementacji...


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
edytowany 1x, ostatnio: kaczus
0

Można jaśniej?

kaczus
nieumiejętnie używasz sizeof
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
2
Kopiuj
void a(string liczby[])

jest równoważne

Kopiuj
void a(string* liczby)

W jednym i drugim przypadku sizeof(liczby) daje rozmiar jednego wskaźnika.

Poza tym używaj vector<string> czy tam array<string, 3> zamiast takich cyrków.

fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
2

jezeli bedziesz uzywac vectora o stalym rozmiarze to lepiej uzyc std::array. Jezeli nie bedzie on staly, to nie inicjalizuj tego vectora z wielkoscia tablicy...
http://stackoverflow.com/questions/8777603/what-is-the-simplest-way-to-convert-array-to-vector
http://stackoverflow.com/questions/259297/how-do-you-copy-the-contents-of-an-array-to-a-stdvector-in-c-without-looping

edytowany 1x, ostatnio: fasadin
0

W takim razie jak mam przekazać rozmiar tablicy statycznej do funkcji?

0

Koniecznie muszę zrobić takie przepisywanie tablicy do vectora, więc proszę o pomoc.

fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

tak, jezeli przekazujesz tablice to ona nie wie jaki ma rozmiar.

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0
Janke527 napisał(a):

W takim razie jak mam przekazać rozmiar tablicy statycznej do funkcji?

Jako osobny parametr funkcji. Co sugeruje, że wygodniej użyć wbudowanego kontenera.

edytowany 1x, ostatnio: twonek
0

Mógłbyś pokazać nagłówek takiej funkcji która miałaby jako parametr rozmiar tablicy statycznej?

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0
Kopiuj
void a(string liczby[], int rozmiar)
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

widze ze liczysz na gotowca. Prosze

Kopiuj
#include <iostream>
#include <vector>
 
using namespace std;
 
void a( string liczby[], int wielkosc )
{
    vector < string > dane;
    for( int i = 0; i < wielkosc; i++ )
    {
      dane.push_back(liczby[i]);
      cout<<dane[i];
    }
 
}
 
int main ()
{
   string moje_liczby[] = { "16", "2", "77" };
   a( moje_liczby, sizeof(moje_liczby)/ sizeof(moje_liczby[0]) ); // to tez zadziala,
   cout << "\n";
   a( moje_liczby, 3 );
 
  return 0;
}

a dziala, bo tablica zostala stworzona w tym samym "scope" (moge sie do tego mylic wiec jak cos niech ktos mnie poprawi). I nie jest to po prostu wskaznikiem, ale dokladnie widac ze przy inizjalizacji ma 3 wartosci. (nie wiem jak to sensowniej wytlumaczyc)

edytowany 1x, ostatnio: fasadin
0

fasadin - dla twojej wiadomości nie liczyłem na gotowca.

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
1
fasadin napisał(a):

a dziala, bo tablica zostala stworzona w tym samym "scope" (moge sie do tego mylic wiec jak cos niech ktos mnie poprawi). I nie jest to po prostu wskaznikiem, ale dokladnie widac ze przy inizjalizacji ma 3 wartosci. (nie wiem jak to sensowniej wytlumaczyc)

Tablica normalnie jest tablicą, a nie wskaźnikiem. Dlatego w tym przypadku

Kopiuj
string moje_liczby[] = { "16", "2", "77" };
cout << sizeof(moje_liczby);

wypisuje rozmiar tablicy (12 na ideone).

Natomiast w C++ nie ma mechanizmu przekazywania tablicy, więc gdy deklarujesz że parametrem funkcji jest tablica, C++ zamienia to na wskaźnik do początku tablicy. Dlatego wewnątrz funkcji

Kopiuj
cout << sizeof(liczby);

wypisuje już rozmiar wskaźnika (4 na ideone).

fasadin
no to mialem na mysli "i nie jest to po prostu wskaznikiem" w sensie ze jest tablica ;)
0

Ok, problem rozwiązany. Dziękuję bardzo za pomoc.

EvilOne
  • Rejestracja:około 14 lat
  • Ostatnio:około 2 miesiące
  • Postów:78
0

vector możesz również zainicjalizować przekazaną tablicą i jej rozmiarem np. tak:

Kopiuj
a(moje_liczby, sizeof(moje_liczby) / sizeof(moje_liczby[0]));

/*...*/

void a(string liczby[], size_t wielkosc)
{
	vector<string> dane(liczby, liczby + wielkosc);
}
edytowany 4x, ostatnio: EvilOne
fasadin
dawalem w pierwszej mojej odpowiedzi :)
EvilOne
@fasadin ah fakt, nie wchodziłem w te linki ; >
vpiotr
z tym że wielkosc najlepiej jako size_t.
EvilOne
@vpiotr słuszna uwaga! (kod był modyfikacją powyższego). ~poprawione.
SM
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:1
0

ss

edytowany 1x, ostatnio: smoczaki

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.