【问题标题】:alternative to std::vector for storing references instead of copies of objects替代 std::vector 用于存储引用而不是对象副本
【发布时间】:2018-05-09 21:41:57
【问题描述】:

我是一名 Java 开发人员,并且是 C++ 新手。
使用 Java:我可以执行以下操作

myArrayList.add(obj);

在“myArrayList”中,我会找到指向“obj”的引用(指针)
但是对于 C++:我知道

std::vector::push_back(obj);

将 'obj' 的副本插入向量而不是引用。如果不是因为创建了大量操作和对象,这通常不会成为问题。

我的问题:
由于使用 std::vector 创建和复制的对象数量过多而导致的性能问题。
我需要什么:
std::vector 的替代方法或其他方式来制作动态引用列表(指针)而不复制对象。

PS:我知道如何制作这样的指针数组

MyClass** dynamic_array = new MyClass*[max_size];

我不能使用它,因为 max_size 是未知的。

感谢您的帮助。

【问题讨论】:

    标签: c++ object vector reference


    【解决方案1】:

    您可以改为存储引用包装器:

    #include <functional>    
    
    MyClass item;
    ::std::vector<::std::reference_wrapper<MyClass>> items;
    items.emplace_back(item);
    // accessing an item will involve an extra call of get() method
    items.back().get();
    

    请注意(与 Java 不同)对象不由 GC 管理,程序员有责任确保引用对象存在足够长的时间以使存储的引用有效。

    【讨论】:

    • 是的,但是 reference_wrapper 本身就是一个对象 -> 创建了更多对象 -> 内存使用情况。
    • @HDRgaming 这不是 java,将指针/引用包装到类中不会引入任何内存开销。
    • @HDRgaming 在 C++ 中创建对象并不一定涉及一些强制性开销。而std::reference_wrapper 是一个专用的轻量级代理类,它不会在原始指针或普通引用上引入任何开销。
    【解决方案2】:

    解决这个问题的一个简单方法是使用指针。这是一个例子:

    struct N { int x; };
    
    void test()
    {
        N temp;
        std::vector<N*> x;
        x.push_back(&temp);
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多