为啥我不能返回这个向量向量?

Posted

技术标签:

【中文标题】为啥我不能返回这个向量向量?【英文标题】:Why can't I return this vector of vectors?为什么我不能返回这个向量向量? 【发布时间】:2015-04-27 18:33:05 【问题描述】:

我有一个类,它声明一个类型为 char 的向量,如下所示,并包含一个读取其中一半并返回结果向量的方法。

class Mapa 

private:
    vector<vector<char> > vec;

public:
    //Constructor
    Mapa():vec(0,vector<char>(0));

    Mapa(int row, int col):vec(row, vector<char>(col));
    virtual ~Mapa();
     

const Mapa& just_Half()
    

        Mapa temp(vec.size(),vec[0].size());
        int a = vec.size()*vec[0].size()/2;
        for (int i = 0; i < vec.size() && a>0; i++, a--)
            for (int j = 0; j < vec[i].size() && a>0; j++, a--)
                temp.vec[i][j]=vec[i][j];
            
        return temp;

    

主要是我做的:

Mapa Mapa1(3, 10);
Mapa Mapa2;
Mapa2=Mapa1.just_Half();

我的问题是为什么 Map2 只是在这个结尾处是空向量? 为什么它没有收到温度?

感谢您的帮助。

【问题讨论】:

该问题与 Visual C++ 无关,因此我删除了该标签。您正在返回对局部变量的引用。这个问题在***.com/q/4643713和***.com/q/2744264等许多问题中都有描述 糟糕,我想说“这个问题不是 Visual C++ 特有的”。 感谢您的指示。很难使用指针和引用。 【参考方案1】:

问题在于您的返回类型是对Mapa 的引用。当函数超出范围时,您返回的 Mapa(在函数内命名为 temp)被破坏,因此您返回未定义的已破坏 Mapa

解决方法很简单,按值而不是按引用返回:

const Mapa just_Half()


    Mapa temp(vec.size(),vec[0].size());
    int a = vec.size()*vec[0].size()/2;
    for (int i = 0; i < vec.size() && a>0; i++, a--)
        for (int j = 0; j < vec[i].size() && a>0; j++, a--)
            temp.vec[i][j]=vec[i][j];
        
    return temp;

如果您担心这会造成不必要的复制,请不要担心。编译器几乎总是会使用 return value optimization 优化该复制操作。

【讨论】:

确实如此。但不幸的是,我坚持使用我发布的方法,因为它是一项任务......我通过使用“静态 Mapa temp”来整理它 如果我处于你的位置,我会向你的导师提出这个问题。您的解决方案绝对不应该是使用静态分配的 Mapa 对象(这样它就不会在函数退出时被破坏)。 是的。会做,因为它对我来说也没有多大意义不得不使用这样的解决方案......谢谢

以上是关于为啥我不能返回这个向量向量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在使用 sort_by_key 对向量进行排序时使用返回引用的键函数?

为啥我不能将整数向量推入 C++ 中的二维整数向量?

为啥我不能在 C++11 中创建一个 lambda 向量(相同类型)?

使用光流的汽车跟踪。为啥向量不能正确绘制

为啥我不能直接从向量中的函数 push_back 更新值? [关闭]

为啥我不能从数据库中保存和检索我的向量(二进制)和特殊字符?