Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向量中的奇怪行为::push_back()_C++_Vector_Push Back - Fatal编程技术网

C++ C++;向量中的奇怪行为::push_back()

C++ C++;向量中的奇怪行为::push_back(),c++,vector,push-back,C++,Vector,Push Back,我将以下数据结构作为名为“Task”的类: 此外,我还有一个包含以下内容的ASCII文件: A 3 10 B 2 12 C 1 11 名称=A,计算时间=3,周期=10,依此类推 现在我想读入文件,创建任务对象并将其推回向量: void read_in_task_list_and_create_tasks(const string &filename, vector<Task> &current_tasks) { ifstream in_file;

我将以下数据结构作为名为“Task”的类:

此外,我还有一个包含以下内容的ASCII文件:

A 3 10
B 2 12
C 1 11
名称=A,计算时间=3,周期=10,依此类推

现在我想读入文件,创建任务对象并将其推回向量:

void read_in_task_list_and_create_tasks(const string &filename, vector<Task> &current_tasks)
{
    ifstream in_file;
    in_file.open(filename.c_str());

    string tmp_name;
    int tmp_computation_time;
    int tmp_period;

    while(!in_file.eof())
    {
        in_file >> tmp_name;
        in_file >> tmp_computation_time;
        in_file >> tmp_period;

//        Task tmp_task(tmp_name, tmp_computation_time, tmp_period);
//        current_tasks.push_back(tmp_task);
        current_tasks.push_back(Task(tmp_name, tmp_computation_time, tmp_period));
    }
}
void read_in_task_list_和创建_任务(常量字符串和文件名、向量和当前_任务)
{
_文件中的ifstream;
打开(filename.c_str());
字符串tmp_名称;
int tmp_计算时间;
国际tmp_期;
而(!in_file.eof())
{
在\u文件>>tmp\u名称中;
在\u文件>>tmp\u计算\u时间;
在\u文件>>tmp\u期间;
//任务tmp_任务(tmp_名称、tmp_计算时间、tmp_周期);
//当前任务。推回(tmp任务);
当前任务。向后推(任务(tmp任务名称、tmp任务计算时间、tmp任务周期));
}
}
现在,当我查看当前的任务向量时,它有元素,但它们的值与我的文件中的值不匹配。 注意下面的句子。tmp_任务对象是完全正确的,但如果它被向后推,它将丢失上面描述的值

这可能是任务类中的复制构造函数问题,因为std::vector正在管理内存分配

我正在Linux x86上使用带有g++编译器的netbeans


THX任务是否定义了复制构造函数和赋值运算符?当你把物体推到向量中时,它不是把那个精确的物体推进去,而是在复制它。因此,我相信您需要定义其中一个(我不记得是哪一个,但如果您定义了其中一个,则最好同时定义这两个)。

确保没有定义复制构造函数或赋值运算符


自动的应该完全做你想做的。

至少在我看来,你采取了一些错误的方法,试图自己做太多的工作。标准库已经可以处理您正在做的大部分工作。您真正需要做的就是指定如何从流中读取单个对象:

struct Task { 
    std::string name;
    int computation_time;
    int period;
};

std::istream &operator>>(std::istream &is, Task &t) {
    return is >> t.name >> t.computation_time >> t.period;
}
然后,您可以使用标准算法实际读取数据并将其放入向量:

void read_in_task_list_and_create_tasks(const string &filename, 
                                        vector<Task> &current_tasks) 
{
    std::ifstream in(filename.c_str());

    std::copy(std::istream_iterator<Task>(in), 
              std::istream_iterator<Task>(),
              std::back_inserter(current_tasks));
}
void read_in_task_list_和_create_tasks(常量字符串和文件名),
向量和当前任务)
{
std::ifstream-in(filename.c_str());
std::copy(std::istream_迭代器(in),
std::istream_迭代器(),
std::back_inserter(当前_任务));
}

作为奖励,这还将解决您由于循环错误而两次读取文件中最后一项的问题(是的,我知道您没有提到这一点,但根据您编写循环的方式,这基本上是不可避免的).

您可以发布
任务
类的完整定义吗?默认的复制构造函数应该对给定的成员执行正确的操作。当然,如果Askener声明了他自己的复制构造函数,他需要确保它能够工作。@Askener,该复制构造函数是正确的签名,但这也意味着它将替换编译器生成的正常默认值,该默认值将对成员进行简单的复制。Netbeans提供的复制构造函数存根不会复制成员数据,因此这将解释您看到的行为。在这种情况下,由于您没有分配自己的内存,您可以删除Netbeans生成的复制构造函数(如果它生成了一个,那么还可以删除赋值运算符)@Herms-如果您定义了其中的一个,那么应该同时定义这两个构造函数。三大法则:@orip-如果我在类中使用新指针或赋值指针分配内存,我只定义复制构造函数。当属性在服务器上分配时,我通常不会这样做stack@beldaz:是的,元素是移动的,而不是复制的,因此(例如),
std::vector
应该可以正常工作(即使您不能复制
unique\u ptr
)。我没有这个问题,因为我的文件没有以换行符结尾,但无论如何,这是一个非常快速和简单的方法来完成这些事情+STL算法的良好使用。我为您修复了
istream\u iterator
的拼写错误。
void read_in_task_list_and_create_tasks(const string &filename, 
                                        vector<Task> &current_tasks) 
{
    std::ifstream in(filename.c_str());

    std::copy(std::istream_iterator<Task>(in), 
              std::istream_iterator<Task>(),
              std::back_inserter(current_tasks));
}