c++从Vector读取元素,在每个索引处打印相同的元素

c++ Reading Element from Vector printing same element at each index

本文关键字:元素 打印 索引 Vector 读取 c++      更新时间:2023-10-16

我有一个用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.cpptoString()函数,下面是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)