【问题标题】:how to initialise objects in a <list> and interate them in c++? Are they randomely stored?如何初始化 <list> 中的对象并在 C++ 中迭代它们?它们是随机存储的吗?
【发布时间】:2016-06-07 00:58:48
【问题描述】:

我是 C++ STL 的新手,正在从电子书和在线资源中学习。我想创建一个对象列表,使用 ::interator 和 list.insert() 初始化它们,最后显示存储在每个对象中的值。 代码如下:

#include <iostream>
#include <list>
#include <algorithm>

#define MAX 50
using namespace std;

class numbers{
    int a;
    int b;
    int c;
    int sumvar;
    int sum()
    {
        return(sumvar=a+b+c);
    }
    public:
    numbers(int a,int b,int c)
    {
        this->a=a;
        this->b=b;
        this->c=c;
    }
    void display()
    {
        cout<<a<<endl<<b<<endl<<c<<endl<<endl;
    }
};

int main()
{
    list<numbers> listofobjects;
    list<numbers>::iterator it=listofobjects.begin();
    for(int i=1;i<MAX-1;i++)
    {
        int j=i*21-4;
        int k=i*j/7;
        numbers *temp = new numbers(i,j,k); //i went through a two step initialise 
        numbers n=*temp;
        listofobjects.insert(it,n);
        it++;
    }

    for(it=listofobjects.begin();it!=listofobjects.end();it++)
    {
        it->display();
    }
}

所以我有两个问题: 1)我是否正确初始化了对象? 2)我运行程序时,程序输出从32开始,不应该是从1开始吗?

【问题讨论】:

    标签: c++ list stl


    【解决方案1】:

    不,您没有正确初始化列表。您的代码泄漏了内存。

    您的代码:

    1) 使用new 分配numbers 类的新实例。

    2) 复制实例化对象

    3) 将复制对象插入std::list

    所以,new-ed 对象被泄露了。你唯一需要做的就是:

        listofobjects.insert(it, numbers(i, j, k));
    

    现在,就顺序错误的原因而言,这是因为一个相关的原因——插入位置的迭代器没有正确递增。您的插入应该是:

        it = ++listofobjects.insert(it, numbers(i, j, k));
    

    【讨论】:

    • 但是当我使用它++时会发生什么?
    • 未定义的行为。 it 的初始值是结束迭代器值,因为最初列表是空的,并且 begin() == end()。 insert() 在给定迭代器值之前 插入一个新元素,因此it 仍然是插入() 之后的结束迭代器值。递增结束迭代器值是未定义的行为。完全不增加 it 也可以获得正确的结果。
    • it = ++listofobjects.insert(it, numbers(i, j, k)); - 我建议push_back(或emplace_back)处理更简洁和交流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2017-08-27
    • 2010-12-25
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多