Как отобразить только первые 10 элементов вектора с помощью итератора? - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь использовать displayVectorVer2(), чтобы он отображал только первые 10 элементов, но я не знаю, как это сделать с итераторами. Я попробовал несколько глупостей, чтобы посмотреть, что произойдет: я сравнил итератор с displayLimit в моем для l oop. Я поиграл, вычитая vobj.end()-5, так как мой профессор заставляет меня использовать только 15 элементов, но я прекрасно знал, что это не очень хорошая идея.

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

template <class T>
void fillVector(std::vector<T>& vobj, int n);

template <class T>
void displayVectorVer2(std::vector<T>& vobj, typename std::vector<T>::iterator ptr);

template <class T>
void fillVector(std::vector<T>& vobj, int n)
{
    srand((unsigned int)time(NULL));
    for (int i=0; i<n; ++i)
    {
        vobj.push_back(rand()%99999+1);
    }
}

template <class T>
void displayVectorVer2(std::vector<T>& vobj, typename std::vector<T>::iterator ptr)
{
    std::cout << "Vector object contains " << vobj.size() << " values which are" << std::endl;

    const unsigned displayLimit = 10;
    if (vobj.size()>displayLimit)
    {
        for (ptr=vobj.begin(); ptr<vobj.end(); ++ptr)
        {
            std::cout << "  " << *ptr;
        }
        std::cout << "  ..." << std::endl;
    }
    else
    {
        for (ptr=vobj.begin(); ptr<vobj.end(); ++ptr)
        {
            std::cout << "  " << *ptr;
        }
        std::cout << std::endl;
    }
}

int main()
{
    std::vector<int> vobj;
    std::cout << "Before calling fillVector(...): vobj contains " 
              << vobj.size() << " values." << std::endl;

    std::cout << "\nEnter # of random values you'd like to store in vobj: ";
    int n;
    std::cin >> n;

    std::cout << "\n*** Calling fillVector(...) ***" << std::endl;
    fillVector(vobj, n);

    std::cout << "\n*** Calling displayVectorVer2(...) ***" << std::endl;
    std::vector<int>::iterator ptr;
    displayVectorVer2(vobj,ptr);
}

1 Ответ

1 голос
/ 11 апреля 2020

Возможно, я думаю слишком просто, но этот вопрос решит ваш вопрос:

Я пытаюсь использовать displayVectorVer2 (), чтобы он отображал только первые 10 элементов

, не зная вашего полного упражнения, вот мой ответ:

...
    const unsigned displayLimit = 10;
    if (vobj.size()>displayLimit)
    {
        for (ptr=vobj.begin(); ptr<vobj.begin()+displayLimit; ++ptr) 
        {
            std::cout << "  " << *ptr;
        }
        std::cout << "  ..." << std::endl;
    }
    else
...

edit:

Это сработало, но почему это работает? Я не забываю добавлять в vobj.begin () и получать дополнительные пустые элементы, добавленные к исходному вектору.

Не уверен, что именно вы сделали, но, возможно, это поможет вам понять ваш код:

...
   const unsigned displayLimit = 10;
    if (vobj.size()>displayLimit)
    {
        //Init ptr outside the for loop
        ptr = vobj.begin();

        //What the for loop is seeing with a more familiar syntax: 
        //for( ; i < 0 +displayLimit; ++i)
        //what you are seeing
        for (/*ptr init*/; ptr < vobj.begin() +displayLimit; ++ptr)
        {
            std::cout << "  " << *ptr;
        }
        std::cout << "  ..." << std::endl;
    }
...

Итераторы просто дают вам значение int, и вы можете использовать его с тем, что когда-либо «съедает» значения int. В вашем случае для l oop.

Если вы скажете программе использовать итератор, вы скажете программе: «Просто дайте мне номер, с которого начинается Вектор, и добавьте 10».

В вашем случае 0 "... и добавьте 10"

Вы также можете написать такой код с n, переданным в функцию, чтобы иметь возможность использовать .end - input + 10 для с 10 строками:

...
template <class T>
void displayVectorVer2(std::vector<T>& vobj, typename std::vector<T>::iterator ptr,int n)
{
    std::cout << "Vector object contains " << vobj.size() << " values which are" << std::endl;

    const unsigned displayLimit = 10;
    if (vobj.size()>displayLimit)
    {
       ptr=vobj.begin();
        for (; ptr<vobj.end() -n +displayLimit; ++ptr)
        {
            std::cout << "  " << *ptr;
        }
        std::cout << "  ..." << std::endl;
    }
    else
    {
        for (ptr=vobj.begin(); ptr<vobj.end(); ++ptr)
        {
            std::cout << "  " << *ptr;
        }
        std::cout << std::endl;
    }
}

int main()
{
    std::vector<int> vobj;
    std::cout << "Before calling fillVector(...): vobj contains "
              << vobj.size() << " values." << std::endl;

    std::cout << "\nEnter # of random values you'd like to store in vobj: ";
    int n;
    std::cin >> n;

    std::cout << "\n*** Calling fillVector(...) ***" << std::endl;
    fillVector(vobj, n);

    std::cout << "\n*** Calling displayVectorVer2(...) ***" << std::endl;
    std::vector<int>::iterator ptr;
    displayVectorVer2(vobj,ptr,n);
}
...

Вы также не должны больше использовать srand в современном коде, поскольку он более 10 лет с тех пор, как c ++ 11 представил <random> и srand может нанести вред вашей программе, если используется для генерации начальных значений для чувствительного кода. Также srand предоставляет не «случайность», которую он должен предоставлять, srand генерирует некоторые числа чаще, чем другие - это не случайно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...