Program nie wyświetla dobrze zawartości std::vector

Odpowiedz Nowy wątek
2020-03-26 10:49

Rejestracja: 2 tygodnie temu

Ostatnio: 2 godziny temu

0
#include <iostream>
#include <vector>

typedef std::vector<int>numbers;
typedef std::vector<int>::iterator it;

void makeVector(int number,numbers &num,const int range)
{
    for(int i=0;i<range;i++)
    {
        std::cout<<"Podaj liczbe: ";
        std::cin>> number;
        num.push_back(number);
    }
}

void showVector(numbers num,it iter)
{
    std::cout<<"\n";
    for(;iter!=num.end();iter++)
    {
        std::cout<<*iter<<"\n";
    }
}

void eraseVectorElement(int number,numbers &num,it iter)
{
    std::cout<<"\n";
    std::cout<<"Ktory element vektora usunac: ";
    std::cin >> number;
    number--;

    iter = num.begin();

    num.erase(iter+number);
}

int main()
{
    const int SIZE_VECTOR = 5;
    numbers numb;
    it iteration;

    int index;
    makeVector(index,numb,SIZE_VECTOR);

    iteration = numb.begin();
    showVector(numb,iteration);

    eraseVectorElement(index,numb,iteration);

    showVector(numb,iteration);
    return 0;
}
Jak idziesz do lekarza to też mówisz tylko "boli mnie" czy raczej rzucasz troszeczkę więcej światła na to co tak właściwie się dzieje? - Patryk27 2020-03-26 11:27
W momencie wyswietlenia zawartosci vecotra program pokazuje jego zawartosc linijka po linijce a nastepnie wyrzuca jakieś śmieci z pamięci i program kończy pracę - Quanti994 2020-03-26 11:31
Biorąc pod uwagę naturę błędu nie wiem by byłaby w stanie to lepiej opisać niż opisuje to tytuł wątku. - kq 2020-03-26 11:32
@kq: imo screenshot bądź przeklejona zawartość konsoli + oczekiwana zawartość - Patryk27 2020-03-26 11:53
U mnie wyświetlał np. pełno zer. Ale owszem, informacja o śmieciach z pamięci/screenshot by nie zaszkodziła. - kq 2020-03-26 11:57

Pozostało 580 znaków

kq
2020-03-26 11:03
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

4

Przekazywanie parametru przez wartość i referencję

void showVector(numbers num,it iter)

przekazujesz wektor przez kopię i przekazujesz iterator do innego wektora jako parametr początkowy.

Ogółem masz dziwną praktykę zapisywania zmiennych wewnętrznych funkcji jako parametrów - nie rób tego.

Funkcje, które bezpośrednio nie odpowiadają za I/O nie powinny tego wykonywać (tutaj tylko showVector się nadaje).

A funkcja makeVector powinna wektor zwracać, a nie przyjmować przez out argument. Po coś te typy zwracane są.


"Ogółem masz dziwną praktykę zapisywania zmiennych wewnętrznych funkcji jako parametrów - nie rób tego." - możesz rozwinąć ? - Quanti994 2020-03-26 11:53
void makeVector(int number,numbers &num,const int range) Chociażby number tutaj - powinien być zmienną wewnątrz funkcji, a nie jej parametrem. - kq 2020-03-26 11:58

Pozostało 580 znaków

2020-03-26 11:21

Rejestracja: 1 rok temu

Ostatnio: 2 minuty temu

2

Dodam: miejsce typedefów jest w archiwach historii.
Z normalną notacją by cię szybciej "piknęło" że Twój kod mocno odbiega od dobrych przykładów.

Kierowałam się tym Klasa <vector> jako argument funkcji. Jeśli typedef to przeżytek to co zamiast tego proponujesz ? - Quanti994 2020-03-26 11:36
Nic. Po prostu std::vector<klasa>. Nie mówi się tu o każdym użyciu ZMIENNEJ, ale o DEKLARACJI. Kod jest powszechnie czytelny dla każdego programisty C++ - AnyKtokolwiek 2020-03-26 11:39

Pozostało 580 znaków

2020-03-26 12:06

Rejestracja: 2 tygodnie temu

Ostatnio: 2 godziny temu

0

Rozumiem,że tak to powinno poprawnie wyglądać ? (Kod działa)

#include <iostream>
#include <vector>

void showVector(std::vector<int> &num,std::vector<int>::iterator iter)
{
    iter = num.begin();
    std::cout<<"\n";
    for(;iter!=num.end();iter++)
    {
        std::cout<<*iter<<"\n";
    }
}

int main()
{
    const int SIZE_VECTOR = 5;
    std::vector<int>numbers;
    std::vector<int>::iterator it;
    int index;

    for(int i=0;i<SIZE_VECTOR;i++)
    {
        std::cout<<"Podaj liczbe: ";
        std::cin>> index;
        numbers.push_back(index);
    }

    showVector(numbers,it);

    std::cout<<"\n";
    std::cout<<"Ktory element vektora usunac: ";
    std::cin >> index;
    index--;

    it = numbers.begin();
    numbers.erase(it+index);

    showVector(numbers,it);

    return 0;
}

Pozostało 580 znaków

kq
2020-03-26 12:07
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

0

Tak pewnie działa, ale sygnatura funkcji showVector powinna wyglądać tak:

void showVector(std::vector<int> const& vec)

Bo vector tutaj nie ulegnie zmianom, stąd const tak ? - Quanti994 2020-03-26 12:08
Zmianom :​) Tak jest. - kq 2020-03-26 12:08

Pozostało 580 znaków

2020-03-26 12:19

Rejestracja: 2 tygodnie temu

Ostatnio: 2 godziny temu

0
#include <iostream>
#include <vector>

void showVector(std::vector<int> const &num)
{
    std::cout<<"\n";
    for(int v: num)
    {
        std::cout<<v<<"\n";
    }
}

int main()
{
    const int SIZE_VECTOR = 5;
    std::vector<int>numbers;
    std::vector<int>::iterator it;
    int index;

    for(int i=0;i<SIZE_VECTOR;i++)
    {
        std::cout<<"Podaj liczbe: ";
        std::cin>> index;
        numbers.push_back(index);
    }

    showVector(numbers);

    std::cout<<"\n";
    std::cout<<"Ktory element vektora usunac: ";
    std::cin >> index;
    index--;

    it = numbers.begin();
    numbers.erase(it+index);

    showVector(numbers);

    return 0;
}

No i niestety wyrzuca mi jakas losowa liczbe w konsoli i petla wyswietlajaca wykonuje sie w nieskonczonosc :(
https://devcode.pl/cpp11-zakresowa-petla-for/

Pozostało 580 znaków

kq
2020-03-26 12:22
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

1

https://wandbox.org/permlink/vC1t9br1FzSTGL3f

U mnie działa. Tak na boku: spacje nie gryzą, można je wstawiać między operatory dla czytelności.


Dobra działa - trzeba było skonfigurować konpilator w Code:Blocksie : https://stackoverflow.com/que[...]upport-to-codeblocks-compiler - Quanti994 2020-03-26 12:27

Pozostało 580 znaków

2020-03-26 12:35

Rejestracja: 2 tygodnie temu

Ostatnio: 2 godziny temu

0

Funkcje, które bezpośrednio nie odpowiadają za I/O nie powinny tego wykonywać

Czyli wszystkie rzeczy związane z wprowadzaniem danych przez uzytkownika lepiej wsadzać do main.cpp jeśli operujemy na konsoli ?

Pozostało 580 znaków

2020-03-26 12:42

Rejestracja: 1 rok temu

Ostatnio: 2 minuty temu

1
Quanti994 napisał(a):

Funkcje, które bezpośrednio nie odpowiadają za I/O nie powinny tego wykonywać

Czyli wszystkie rzeczy związane z wprowadzaniem danych przez uzytkownika lepiej wsadzać do main.cpp jeśli operujemy na konsoli ?

  1. Ja zawsze doradzam w podobnych szkolnych programach podanie referencji do strumienia jako argument do funkcji typu "wprowadź". Wtedy Twoje pytanie otrzymuje raczej sensowną odpowiedź
  2. w sensownym projekcie obiektowym elementarne dane w obiekcie są niepubliczne, i wtedy by były niedostępne w main()

Pozostało 580 znaków

2020-03-26 16:28

Rejestracja: 4 lata temu

Ostatnio: 5 godzin temu

1

Zamiast funkcji showVector możesz użyć oszczędzającego kod przeładowania operatora <<, działającego dla standardowych kontenerów zawierających typy wbudowane. (C++ 17)

#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <algorithm>

using namespace std;

template< typename T >
using IsCorrectInput = enable_if_t< is_integral_v<T> || is_floating_point_v<T> || is_same<string,T>::value , bool >;

template< template<typename,typename> typename Container, typename T, typename Allocator, IsCorrectInput<T> = true >
ostream& operator<<( ostream& out , const Container<T,Allocator>& container )
{
    copy( container.cbegin() , container.cend() , ostream_iterator<T>(out," ") ); out << "\n";
    return out;
}

int main()
{
    vector<int> data1 {23,54,-23,887};
    list<double> data2 {-2.5,4.02,-0.87,-19.9};

    cout << data1;
    cout << data2;

    return 0;
}

https://wandbox.org/permlink/h9PkTiss7f74ASwX

Tbh po prostu copy bym użył :​P - kq 2020-03-26 17:13
Mógłbyś na PW wyjaśnić laikowi tą deklarację szablonu ? Dla laika takiego jak ja to jest czarna magia :P BTW - kod mi nie odpala nawet po zaznaczeniu C++17 - Quanti994 2020-03-26 18:22
Brakuje jeszcze <type_traits>, może jeszcze czegoś. - kq 2020-03-26 18:26

Pozostało 580 znaków

2020-03-26 18:54

Rejestracja: 3 lata temu

Ostatnio: 6 godzin temu

0

Nie czytałem wątku, ale nie sądziłem, że może być w C++ problem z wyświetleniem wektora; swoją drogą mogliby w końcu nadpisać wyjście, żeby cout << v dawało coś normalnego, np.: [1, 2, 3].


edytowany 1x, ostatnio: lion137, 2020-03-26 19:20
Problemu nie ma jak nie robisz dziwnej gimnastyki - kq 2020-03-26 18:55
Acha, czyli OP coś kombinował, zamiast prostego guglania: "print vector c++" ;-) - lion137 2020-03-26 18:56
no ja wolałbym [1, 2, 3] zamiast [1, 2 , 3] - enedil 2020-03-26 19:19
Ha, ha, ha, rzeczywiście ;) poprawione, przecinek przed spacją, największy lameryzm ;). - lion137 2020-03-26 19:20

Pozostało 580 znaków

Odpowiedz

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