为什么我不能 return 这个向量向量?
Why can't I return this vector of vectors?
我有一个 class 声明了一个 char
类型向量的向量,如下所示,并包含一个方法来读取它的一半和 return 结果向量。
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 最后是空向量?
为什么收不到温度?
感谢您的帮助。
问题是您的 return 类型是对 Mapa
的引用。 Mapa
(在函数内部命名为 temp
)你 returning 在函数超出范围时被破坏,所以你 returning 一个被破坏的 Mapa
,未定义。
解决方法很简单,return按值而不是按引用:
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.
优化复制操作
我有一个 class 声明了一个 char
类型向量的向量,如下所示,并包含一个方法来读取它的一半和 return 结果向量。
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 最后是空向量? 为什么收不到温度?
感谢您的帮助。
问题是您的 return 类型是对 Mapa
的引用。 Mapa
(在函数内部命名为 temp
)你 returning 在函数超出范围时被破坏,所以你 returning 一个被破坏的 Mapa
,未定义。
解决方法很简单,return按值而不是按引用:
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.
优化复制操作