首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在stl中迭代结构类型的队列

在stl中迭代结构类型的队列
EN

Stack Overflow用户
提问于 2019-06-15 06:17:22
回答 2查看 281关注 0票数 1

我有一个结构类型队列的简单示例。以下是极客ide链接:https://ide.geeksforgeeks.org/PDvXlup2Z6

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;

struct Task{
    int pid;
    int days;
    int depend;
};

int main()
{
    int w,i,j,t,id,day,dep;
    cin>>t;
    Task task[t];
    for(i=0;i<t;i++)
    {
        cin>>id>>day>>dep;
        task[i].pid=id;
        task[i].days=day;
        task[i].depend=dep;
    }
    //for(i=0;i<t;i++)
    //cout<<task[i].pid<<" "<<task[i].days<<" "<<task[i].depend<<endl;

    queue<Task> job_queue;
    //queue<struct Task>::iterator it;

    for(i=0;i<t;i++)
        job_queue.push(task[i]);

    cout<<"Queue size is: "<<job_queue.size()<<endl;
    /*for(auto it = job_queue.begin();it!=job_queue.end();it++)
    {
        cout<<*it->pid<<endl;
    }*/
    return 0;
}

在迭代队列中,我面临着打印其所有元素的问题,以及如何获取队列内容的特定元素(如queue[i].id or queue[i].depend )?请帮助我,因为我不知道正确的语法。对于上述代码输入:

代码语言:javascript
复制
4
1 2 0
2 4 1
3 7 0
4 12 1

输出:队列大小为:4

以下是极客ide链接:https://ide.geeksforgeeks.org/PDvXlup2Z6

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-15 10:29:15

让我试着支持你。你对STL的了解越来越多,这是件好事。

因此,您希望将元素存储在FIFO中,这是一个“先到先出”的容器。您检查了STL并发现std::queue最合适。它正是你所需要的:

  • 前面
  • 流行

因此,您选择std::queue作为元素“Task”的容器。现在,看看您的代码,有几个改进步骤,可以提出一个现代的C++程序。

首先,我们需要消除C++语法(和语义)错误。在C++中,您不能定义动态普通数组。数组的维数需要是编译时间常数。所以一个真正的C++编译器不会吃掉

代码语言:javascript
复制
Task task[t];

但是幸运的是,C++有一个类似于普通数组的容器,但是它可以动态增长: std::vector。与普通数组相比,您应该更喜欢std::vector (或其他容器)。结果是:

代码语言:javascript
复制
std::vector<Task> task(t);

这将创建一个带有t空任务的向量。

下一个优化是删除临时变量。在输入循环中,您可以编写:

代码语言:javascript
复制
cin >> task[i].pid >> task[i].days >> task[i].depend;

这样你就可以消除3个临时变量: id,day,dep,另外你还可以删除w和j,它们是不需要的。

下一步:类或结构知道如何读取(或写入)其值。因此,您将为类任务重载>>运算符。有了这个开始,你的课就会像这样:

代码语言:javascript
复制
struct Task {
    int pid;
    int days;
    int depend;
    friend istream& operator>>(istream& is, Task& task) { return is >> task.pid >> task.days >> task.depend;  }
};

int main()
{
    int t, i;
    cin >> t;
    std::vector<Task> task(t);
    for (i = 0; i < t; i++)
    {
        cin >> task[i];
    }

    . . . . 

已经好多了。现在是下一个主要的问题和你问题的答案。为了调试目的,您希望在job_queue上进行迭代。你在问:

在stl中迭代结构类型的队列

答案是:不可能。

队列没有迭代器,也没有索引运算符[]。原因是std::queue是不同STL容器的包装器。std::queue的意图是隐藏它的“内部”值,并且只允许访问前面和后面。对于您的正常目的来说,这是可以的,但对于您希望访问调试用例中的“内部”成员来说,这是可以的。解决办法很简单。选择一个不同的容器,在这种情况下,并为您的目的,一个std::deque。也有你所需要的功能,例如前,后。push和pop函数扩展了名称,因为有一个pop_front和一个pop_back以及一个psuh_front和push_back。这就是问题所在,它有迭代器和索引运算符[]。现在你可以这样做你的程序了:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <deque>

using namespace std;

struct Task {
    int pid;
    int days;
    int depend;
    friend istream& operator>>(istream& is, Task& task) { return is >> task.pid >> task.days >> task.depend; }
    friend ostream& operator<<(ostream& os, const Task& task) { return os << task.pid << ' ' << task.days << ' ' << task.depend; }
};

int main()
{
    int t, i;
    cin >> t;
    std::vector<Task> task(t);
    for (i = 0; i < t; i++)
    {
        cin >> task[i];
    }
    deque<Task> job_queue;
    for (i = 0; i < t; i++)
        job_queue.push_back(task[i]);

    cout << "Queue size is: " << job_queue.size() << endl;
    // Option 1
    for (i = 0; i < t; ++i) {
        cout << task[i] << '\n';
    }
    // Option 2, more C++
    for (auto it = job_queue.begin(); it!=job_queue.end(); ++it){
        cout << *it << '\n';
    }
    // Or, even better, taking C++ range based for
    for (const auto& taskref : job_queue) {
        cout << taskref  << '\n';
    }
    return 0;
}

但这并不是终点。在C++中,您可以对任何事情使用算法。对于输入和输出,您尤其可以使用std::istream_iterator和std::ostream:iterator和std::copy函数。

有了这一点,这可能是最后的优化,您的程序看起来如下:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
#include <iterator>

struct Task {
    int pid;
    int days;
    int depend;
    friend std::istream& operator>>(std::istream& is, Task& task) { return is >> task.pid >> task.days >> task.depend; }
    friend std::ostream& operator<<(std::ostream& os, const Task& task) { return os << task.pid << ' ' << task.days << ' ' << task.depend; }
};

int main()
{
    int numberOfTasks{ 0 };
    std::deque<Task> jobQueue{};

    std::cin >> numberOfTasks;

    // Read all task values
    std::copy_n(std::istream_iterator<Task>(std::cin), numberOfTasks, std::back_inserter(jobQueue));

    // For Debug purposes. Print job Queue
    std::copy(jobQueue.begin(), jobQueue.end(), std::ostream_iterator<Task>(std::cout, "\n"));

    return 0;
}

这就是“多C++”的解决方案。

我希望我能帮你一点忙。。。

票数 1
EN

Stack Overflow用户

发布于 2019-06-15 07:50:52

最后,我找到了我的解决方案:

代码语言:javascript
复制
for(i=0;i<t;i++)
        job_queue.push(task[i]);

    auto iter=0;
    int size =job_queue.size();
    Task temp;
    while(iter++ <size)
    {
        temp=job_queue.front();
        cout<<"Entry "<< temp.pid<<" "<<temp.days<<" "<<" "<<temp.depend<<endl;
        job_queue.pop();
        job_queue.push(temp);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56607863

复制
相关文章

相似问题

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