wczytywanie tablicy do vectora

0

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

 
#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;
}


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...

0

Można jaśniej?

2
void a(string liczby[])

jest równoważne

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.

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

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.

0

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

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.

0

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

0
void a(string liczby[], int rozmiar)
0

widze ze liczysz na gotowca. Prosze

#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)

0

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

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

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

cout << sizeof(liczby);

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

0

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

0

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

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

/*...*/

void a(string liczby[], size_t wielkosc)
{
	vector<string> dane(liczby, liczby + wielkosc);
}
0

ss

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