我有一个结构类型队列的简单示例。以下是极客ide链接:https://ide.geeksforgeeks.org/PDvXlup2Z6
#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 )?请帮助我,因为我不知道正确的语法。对于上述代码输入:
4
1 2 0
2 4 1
3 7 0
4 12 1输出:队列大小为:4
以下是极客ide链接:https://ide.geeksforgeeks.org/PDvXlup2Z6
发布于 2019-06-15 10:29:15
让我试着支持你。你对STL的了解越来越多,这是件好事。
因此,您希望将元素存储在FIFO中,这是一个“先到先出”的容器。您检查了STL并发现std::queue最合适。它正是你所需要的:
因此,您选择std::queue作为元素“Task”的容器。现在,看看您的代码,有几个改进步骤,可以提出一个现代的C++程序。
首先,我们需要消除C++语法(和语义)错误。在C++中,您不能定义动态普通数组。数组的维数需要是编译时间常数。所以一个真正的C++编译器不会吃掉
Task task[t];但是幸运的是,C++有一个类似于普通数组的容器,但是它可以动态增长: std::vector。与普通数组相比,您应该更喜欢std::vector (或其他容器)。结果是:
std::vector<Task> task(t);这将创建一个带有t空任务的向量。
下一个优化是删除临时变量。在输入循环中,您可以编写:
cin >> task[i].pid >> task[i].days >> task[i].depend;这样你就可以消除3个临时变量: id,day,dep,另外你还可以删除w和j,它们是不需要的。
下一步:类或结构知道如何读取(或写入)其值。因此,您将为类任务重载>>运算符。有了这个开始,你的课就会像这样:
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。这就是问题所在,它有迭代器和索引运算符[]。现在你可以这样做你的程序了:
#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函数。
有了这一点,这可能是最后的优化,您的程序看起来如下:
#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++”的解决方案。
我希望我能帮你一点忙。。。
发布于 2019-06-15 07:50:52
最后,我找到了我的解决方案:
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);
}https://stackoverflow.com/questions/56607863
复制相似问题