【问题标题】:Adding element to Array of Objects in C++在 C++ 中向对象数组添加元素
【发布时间】:2012-02-11 21:00:31
【问题描述】:

如何在 C++ 中动态地将元素添加到数组的末尾?

我习惯使用向量来动态添加元素。但是,vector 似乎不想处理对象数组。

所以,我的主要目标是拥有一个对象数组,然后能够在数组末尾添加一个元素以获取另一个对象。

编辑** 抱歉,是 pushback() 导致了我的问题。

class classex
{
private:
    int i;

public:
    classex() { }
    void exmethod()
    {
        cin >> i;
    }
};

void main()
{
    vector <classex> vectorarray;
    cout << vectorarray.size();
    cout << vectorarray.push_back();
}

现在我知道 push_back 必须有一个参数,但是什么参数?

【问题讨论】:

  • “但是,向量似乎不想处理对象数组”?能否请您澄清一下,或许可以举例说明您在哪里尝试这样做以及出了什么问题?
  • 你能解释一下为什么“向量似乎不想处理对象数组”吗?
  • vectors does not seem to want to handle an array of objects 让我们专注于此。这是你真正的问题。让我们弄清楚这意味着什么,然后再得出结论,即您需要从明确的技术切换到并非旨在满足您需求的技术。
  • 我不明白使用 std::vector 有什么问题?
  • 向量甚至与C API兼容,选择向量,它们大多替换固定大小的数组:)

标签: c++ arrays oop object dynamic


【解决方案1】:

现在我知道 push_back 必须有一个参数,但是什么参数?

参数是你想附加到向量的东西。有什么比这更简单或更值得期待的?

顺便说一句,你真的,真的,真的在 99% 的情况下不希望 exmethod 作为 classex 的实际方法。课程不是这样运作的。收集信息以创建实例不是班级工作的一部分。该类只是根据该信息创建实例。

【讨论】:

    【解决方案2】:

    数组是固定大小的容器。所以扩大它们是不可能的。您可以解决这个问题并将一个数组复制到一个更大的位置并在旧端后面获得空间,但就是这样。

    您可以创建一个比您当前需要的更大的数组,并记住哪些元素是空的。当然,它们永远不会为空(它们至少包含 0),但那是另一回事。

    和数组一样,有很多容器,有些可以增长,比如 stl 容器:列表、向量、双端队列、集合等等。

    添加一个构造函数来设置 i(只是为了给你的例子一个真实世界的感觉)你的例子 classex,像这样:

    class classex {
    public:
        classex(int& v) : i(v) {}
    private:
        int i;
    };
    

    增长容器的示例如下所示:

    vector <classex> c; // c for container
    // c is empty now. c.size() == 0
    
    c.push_back(classex(1));
    c.push_back(classex(2));
    c.push_back(classex(3));
    // c.size() == 3
    

    【讨论】:

    • 所有 STL 容器都可以增长。
    • @NicolBolas 不是 std::array :)
    • 主要概念点是C数组(包括它的大小)是一个类型,而C++是静态类型的。这种认识对于理解“动态数据结构”的需求至关重要。
    【解决方案3】:

    编辑: 问题是如何将元素添加到动态分配的数组中,但 OP 实际上是指 std::vector。分隔符下方是我的原始答案。

    std::vector<int> v;
    v.push_back( 5 ); // 5 is added to the back of v.
    

    您始终可以使用 C 的 reallocfree编辑:(假设您的对象是 POD。)

    与使用newdelete 手动分配、复制和重新分配的要求相比,Stroustrup 没有添加像 renew 这样的关键字真是个奇迹。

    【讨论】:

    • 一般来说不在 C++ 中。这是未定义的行为。
    • 你能给我一个来源吗?我没有发现 malloc 是谷歌未定义的行为,如果这是真的,在你的 C++ 代码中包含 C 库不会破坏它吗?我什至记得读过允许编译器对 new 的实现调用 malloc。另外,如果你是对的,那么 C++ 不向后兼容 C,这是一个主要的设计选择。
    • realloc 是有问题的,因为您不允许移动对象的内存(想象一下,如果对象存储指向其成员之一的指针)。这是 3.8(1)(对象生命周期)的直接结果。
    • 如果你想要一个数组可以调整大小,你不想假设它总是在内存中的同一个地方,所以传递一个直接的指针就像传递向量::迭代器。 (与使用 new 和 delete 重新分配没有什么不同。)。 vector 基本上是一个 T*&,这是我要传递的。不过,我的回答实际上仍然是错误的,因为 OP 想要使用向量,而不是数组。
    • 不,仍然没有。 C++有objects,object有lifetime,它们必须是constructed。您不能简单地移动对象的内存表示,因为在新位置不会有 对象。您确实需要在新位置重建一个新对象。没有“更新”之类的东西是有意义的,但也许this question of mine 有一些辅助兴趣。
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2013-09-23
    • 2021-09-01
    • 1970-01-01
    • 2019-12-31
    • 2012-11-16
    相关资源
    最近更新 更多