c++从Vector读取元素,在每个索引处打印相同的元素
c++ Reading Element from Vector printing same element at each index
我有一个用JAVA实现的算法,但我想用MPI和OpenMP在C/C++中测试算法的性能。所以我正在重新编写代码。我已经好几年没有接触过C++了,所以我需要一些建议和指导。我将类Task
的对象放在一个向量中,并尝试使用for循环检查所有元素的值。
这是我的Task.h
文件的代码。我创建了tostring
函数来打印对象的所有值。
#include <vector>
#include <string>
//for std::vector
#ifndef TASK_H
#define TASK_H
class Task {
public:
Task();
Task(const Task& orig);
Task(int identity, float val, long st, long et, long ext, std::vector<int> deplist2, std::vector<int> pretask2);
void setTId(int identity) ;
int getTId() ;
void setVal(float val) ;
float getVal() ;
long getStarttime() ;
void setStarttime(long value) ;
long getEndtime() ;
void setEndtime(long value) ;
long getExectime() ;
void setExectime(long value) ;
std::vector<int> getDeplist() ;
void setDeplist(std::vector<int> value);
std::vector<int> getPretask() ;
void setPretask(std::vector<int> value);
std::string toString();
virtual ~Task();
private:
};
#endif /* TASK_H */
Task.cpp
的toString()
函数,下面是Task.cpp
#include "Task.h"
#include <vector> //for std::vector
#include <string> //for std::string
#include <iostream>
#include <sstream>
using namespace std;
int id;
float value;
long starttime;
long endtime;
long exectime;
std::vector<int> deplist;
std::vector<int> pretask;
void Task::setTId(int identity) {
id = identity;
}
int Task::getTId() {
return id;
}
void Task::setVal(float val) {
value = val;
}
float Task::getVal() {
return value;
}
long Task::getStarttime() {
return starttime;
}
void Task::setStarttime(long value) {
starttime = value;
}
long Task::getEndtime() {
return endtime;
}
void Task::setEndtime(long value) {
endtime = value;
}
long Task::getExectime() {
return exectime;
}
void Task::setExectime(long value) {
exectime = value;
}
std::vector<int> Task::getDeplist() {
return deplist;
}
void Task::setDeplist(std::vector<int> value) {
deplist = value;
}
std::vector<int> Task::getPretask() {
return pretask;
}
void Task::setPretask(std::vector<int> value) {
pretask = value;
}
string Task::toString() {
std::ostringstream oss;
int pSize = pretask.size();
int depSize = deplist.size();
string returnStr = "";
cout << "printing " << id << endl;
oss << "n[ id = "<< id;
oss << " , val = " << value << " startTime = " << starttime;
oss << " , endTime = " << endtime;
oss << " , execTime = " << exectime;
oss << " depList = @/ ";
for (int var = 0; var < depSize; var++) {
int tmp = deplist.at(var);
oss << tmp << " , ";
}
oss << " @/ Pretasks = $<< ";
for (int var = 0; var < pSize; var++) {
int tmp = pretask.at(var);
oss << tmp << " , ";
}
oss << " >>$ ] n";
returnStr.append(oss.str());
return returnStr;
}
Task::Task() {
}
Task::Task(int identity, float val, long st, long et, long ext,
std::vector<int> deplist2, std::vector<int> pretask2) {
id = identity;
value = val;
starttime = st;
endtime = et;
exectime = ext;
deplist = deplist2;
pretask = pretask2;
cout << "added task " << id<<endl;
}
Task::Task(const Task& orig) {
}
Task::~Task() {
}
我的主要功能创建一个向量并插入对象,如以下
std::vector<Task> taskList;
taskList.reserve(num_tasks); // Set size of vector
// populate the tasks
{
int i;
//#pragma omp parallel for private(i) shared (taskList) reduction(+:taskLength)
for (i = 0; i < num_tasks; i++) {
int rand = min + (std::rand() % (max - min + 1));
taskLength+=rand;
std::vector<int> deplist2;
std::vector<int> pretask2;
taskList.push_back(Task(i, rand, 0, 0, 0, deplist2, pretask2));
//taskList.insert(i,Task(i, rand, 0, 0, 0, deplist2, pretask2));
cout <<i<<endl;
}
}
{
for (int var = 0; var < num_tasks; var++) {
Task tmpT=taskList[var];
string prt= tmpT.toString();
cout << var << " "<<prt;
}
}
但我的输出看起来像
printing 9
0
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
1
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
2
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
3
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
4
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
5
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
6
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
7
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
8
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
printing 9
9
[ id = 9 , val = 12 startTime = 0 , endTime = 0 , execTime = 0 depList = @/ @/ Pretasks = $<< >>$ ]
到目前为止,我已经尝试使用vector.at()方法来访问该函数,但它也做了同样的事情。任何想法都会有所帮助。谢谢:)
更新1:添加了Task.cpp
因为看起来每行打印出来的元素都是插入的最后一个元素,所以很可能是您错误地创建了static
字段。如果你发布了Task
类的代码,那会很有帮助。具体来说,构造函数的实现,以及我假设您从帖子中删除的私有字段。此外,我想,如果您努力将代码更改为一个完整的、最小的示例,您可能会自己发现错误。如果没有看到更多的代码,很难判断是什么导致了您的问题。
找到解决方案,问题是Task类的成员不是私有的。所以更改了我的头文件Task.cpp
,并添加了私人部分中的所有成员
#include <vector>
#include <string>
//for std::vector
#ifndef TASK_H
#define TASK_H
class Task {
public:
Task();
//Task(const Task& orig);
Task(int identity, float val, long st, long et, long ext,
std::vector<int> deplist2, std::vector<int> pretask2);
void setTId(int identity);
int getTId();
void setVal(float val);
float getVal();
long getStarttime();
void setStarttime(long value);
long getEndtime();
void setEndtime(long value);
long getExectime();
void setExectime(long value);
std::vector<int> getDeplist();
void setDeplist(std::vector<int> value);
std::vector<int> getPretask();
void setPretask(std::vector<int> value);
std::string toString();
virtual ~Task();
private:
int id;
float value;
long starttime;
long endtime;
long exectime;
vector<int> deplist;
vector<int> pretask;
};
#endif /* TASK_H */
这就是我现在认为实际有效的方法(抱歉还在学习)。LOLz。使用删除复制构造函数
Task(const Task& orig)
相关文章:
- 从控制台中删除最后打印的元素
- 数组元素打印的递归方法
- 打印所有链表的元素 (C++)
- 更新的矢量元素不打印
- 打印矢量数组中的所有元素
- 为什么我在尝试在单向链表中打印元素时会出现这个永无止境的循环
- 如何在c ++中打印给定桶号的所有元素unordered_set?
- 为什么平均打印数组元素比打印单个对象慢C++?
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 使用 <list> (错误 C2760) 打印队列的元素
- 使用哈希图打印第一个重复元素;
- 打印二叉树中的常见元素
- 打印无序映射的第二个元素,即集合
- 打印所有儿童树元素的最佳算法?
- 类中的 C++ 全局映射,不要打印 map 元素
- 为什么数组不打印第一个元素?
- C++ Expat 仅打印元素的第一个字母和标签中的数据
- 打印出对象向量中的每个元素C++
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?