繁体   English   中英

为什么返回std :: vector仍在复制?

[英]Why returning a std::vector is still making a copy?

我有一个要创建大量我不想复制的数据的类。 出于所有考虑,班级以外的任何人都是不可变的(只读)。

这是一个概念代码,显示了我要如何实现它:

class C {
public:
    C();
    std::vector<int> const& get_vector() { return m_vector; }
private:
    std::vector<int> m_vector;
};

C::C()
{
    m_vector.push_back(1);
    m_vector.push_back(2);
}

void DisplayVector(std::vector<int> const& new_v)
{
    for (int i = 0; i<new_v.size(); i++)
        std::cout << new_v[i] << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    C myobj;
    std::vector<int> v = myobj.get_vector();
    v.push_back(3);

    DisplayVector(v);
}

当我单步执行此代码时,会看到m_vector的给定内存地址及其数组的第一个元素(使用begin迭代器)。

当我从get_vector返回时,向量“ v”及其第一个元素具有完全不同的内存地址。 v.push_back(3)修改v没有任何问题(因为它看起来像是副本)

当我调用DisplayVector时,它可以按预期工作,并且new_v地址与主v相同。

我究竟做错了什么?

您明确创建了一个副本

std::vector<int> v = myobj.get_vector();

由于v是纯vector<int> ,因此可以修改。 v在这里是复制构造的。

而是绑定引用(由于get_vector的返回类型而必须为const ),请使用

const std::vector<int>& v = myobj.get_vector();

要不就

const auto& v = myobj.get_vector();
int _tmain(int argc, _TCHAR* argv[])
{
    C myobj;
    std::vector<int> v = myobj.get_vector();

执行此代码后,您将获得两个向量; 实例变量myobj.m_vectorv

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM