首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Iterator只显示向量的前10个元素?

如何使用Iterator只显示向量的前10个元素?
EN

Stack Overflow用户
提问于 2020-04-11 01:05:17
回答 1查看 536关注 0票数 1

我试图使用displayVectorVer2()让它只显示前10个元素,但我不知道如何使用迭代器。我确实尝试了一些愚蠢的事情,只是为了看看会发生什么:我在for循环中将迭代器与displayLimit进行了比较。我到处玩减vobj.end()-5,因为我的教授只让我使用15个元素,但我完全知道这不是个好主意。

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-11 03:20:25

也许我想的太简单了,但是,这解决了你的问题:

--我试图使用displayVectorVer2()让它只显示前10个元素

在不知道你的充分练习的情况下,这就是我的答案:

代码语言:javascript
复制
...
    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
...

编辑:

是起作用的,但为什么要工作呢?我记得添加到vobj.begin()中,并将额外的空元素附加到原始向量中。

不确定您到底做了什么,但也许这有助于您理解代码:

代码语言:javascript
复制
...
   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值一起使用。在您的例子中,for循环。

如果你让程序使用迭代器,你就告诉程序:“给我矢量开头的数字,然后添加10”。

在您的例子中,0 "...and相加10“

您还可以编写类似的代码,将n传递给函数,以便能够使用.end - with + 10显示10行:

代码语言:javascript
复制
...
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了,因为它经过十多年的简化,since c++11 introduced 和srand都会损害您的程序f.e。如果用于生成敏感代码的种子。另外,srand提供的不是它应该提供的“随机性”,srand generates some numbers more often than others --这不是随机的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61150861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档