Vector - wypisanie tablicy.

0

Witam

Dlaczego za każdym razem jak uruchamiam ten program to wypisuje mi same zera zamiast losowych liczb? Program losuje liczby od 1 do 10, więc nie może wylosować żadnego zera.

#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
    srand(time(NULL));
    vector<int> arr(5);

    for(int i = 0; i < 5; i++)
        arr.push_back(rand() % 10 + 1);

    for(int i = 0; i < 5; i++)
        cout<<arr[i]<<"\n";

return 0;
}
3
vector<int> arr(5)

Stwórz wektor, który ma 5 elementów, elementy inicjalizuj domyślnym konstruktorem (dla typu int będzie to int(), które daje 0)

arr.push_back

Dodaj na koniec nowe elementy, czyli szósty, siódmy itd.

cout << 

Wypisz pierwsze 5 elementów.

To co chciałeś zapewne osiągnąć to

vector<int> arr;
arr.reserve(5)
0

Najpierw tworzysz vector 5 elementowy, o wartościach 0

vector<int> arr(5); 

A potem dopisujesz do niego jeszcze 5 elementów. W efekcie masz rozmiar równy 10.

3

http://melpon.org/wandbox/permlink/AuP34XtUj1FGS74I

#include <algorithm>
#include <random>
#include <iostream>
#include <functional>
#include <iterator>
using namespace std;

int main(){
    default_random_engine gen;
    uniform_int_distribution<> distro(1, 10);
    vector<int> data(5);
    generate_n(begin(data), 5, bind(distro, gen));
    copy(begin(data), end(data), ostream_iterator<int>(cout, " "));
}
3

@spartanPAGE, jak już się bawić to na całego ; p

#include <iostream>
#include <random>
#include <experimental/algorithm>
#include <experimental/iterator>
 
int main()
{
    std::vector<int> in = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::experimental::sample(
        std::begin(in),
        std::end(in), 
        std::experimental::make_ostream_joiner(std::cout, " "),
        5,
        std::mt19937{std::random_device{}()});
}
0

Mam jeszcze jedno pytanie do tego tematu, dlaczego jak użyje zwykłej pętli do wypisania elementów to wypisuje mi 5 pierwszych elementów, a jak użyje pętli for each to wypisuje mi 10?

#include <iostream>
#include <vector>
#include <random>
using namespace std;

int main()
{
    default_random_engine gen;
    uniform_int_distribution<> distro(1, 10);
    vector<int> arr(5);

    for(int i = 0; i < 5; ++i)
        arr.push_back(distro(gen));

    for(int it : arr)
        cout << it << "\n";

    return 0;
}

2.PNG

2

vector<int> arr(5); - tworzysz wektora z 5 elementami (równymi 0) "na dzień dobry";

for(int i = 0; i < 5; ++i) arr.push_back(distro(gen)); - dokładasz pięć kolejnych elementów (każde push_back - dołożenie elementu na koniec); wektor ma już 10 elementów

for(int it : arr) cout << it << "\n"; wypisujesz wszystkich 10 elementów: początkowe 5 które wsadziłeś jak tworzyłeś wektora i kolejne 5 które wylosowałeś

Poprawa:

Zamiast:

for(int i = 0; i < 5; ++i)
        arr.push_back(distro(gen));

Napisać:

for(int i = 0; i < 5; ++i)
        arr.at(i) = distro(gen);

Zamiast wsadzać nowy element ustawiasz wartość elementu, który już tam jest

0
Wielki Kot napisał(a):

Mam jeszcze jedno pytanie do tego tematu, dlaczego jak użyje zwykłej pętli do wypisania elementów to wypisuje mi 5 pierwszych elementów, a jak użyje pętli for each to wypisuje mi 10?

foreach iteruje po WSZYSTKICH elementach. Do tego został stworzony i tak działa. W zwykłym forze to Ty decydujesz o tym co i jak będzie iterowane. Foreach iteruje po wszystkim. Zapis:

 
for(int a: v)
{
  cout << a << endl;
}

jest równoważny:

for(size_t i = 0; i < v.size(); ++i)
{
  cout << v[i] << endl;
}

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