Vector :: push_back()中的C ++好奇行为

时间:2010-11-18 21:18:05

标签: c++ vector push-back

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

private:
string name;
int computation_time;
int period;

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

A 3 10
B 2 12
C 1 11

name = A,computation_time = 3,period = 10等......

现在我想读入文件,创建Task-object并将其推回到vector:

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));
    }
}

现在,当我查看current_tasks向量时,它有元素,但它们的值与我的in_file值不匹配。 观看已注释的线条。 tmp_task对象是完全正确的,但如果它被推回,它就会失去上面描述的值。

这可能是Task-class中的Copy-Constructor问题,因为std :: vector正在管理内存分配吗?

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

THX

3 个答案:

答案 0 :(得分:5)

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

自动的应该完全按照你想要的那样做。

答案 1 :(得分:5)

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

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));
}

作为一个奖励,这也将解决你的问题,因为你的循环是错误的(因为,我知道你没有提到,但根据你如何写你的循环,它基本上是不可避免的。)

答案 2 :(得分:2)

Task是否定义了复制构造函数和赋值运算符?当你将对象推入向量时,它并没有将那个对象推入,它正在复制它。所以我相信你需要定义其中一个(我不记得哪个,但是如果你定义的话,定义它们总是好的。)