为什么返回std :: vector仍在制作副本?

时间:2015-04-29 03:34:30

标签: c++ vector stl

我有一个课程,它将创建一个我不想被复制的大量数据。对于所有考虑因素,对于我班级以外的任何人来说,它都是不可变的(只读)。

这是一个概念代码,展示了我希望如何实现它:

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返回时,向量&#34; v&#34;它的第一个元素有一个完全不同的内存地址。 v.push_back(3)修改v没有任何问题(因为它看起来像是副本)

当我调用DisplayVector时,它按预期工作,new_v地址与main v相同。

我做错了什么?

2 个答案:

答案 0 :(得分:5)

您使用

明确创建了副本
std::vector<int> v = myobj.get_vector();

您可以修改,因为v是普通的vector<int>。这里v得到了复制。

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

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

或只是

const auto& v = myobj.get_vector();

答案 1 :(得分:0)

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

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