作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我读了几篇关于如何从方法返回 vector 的文章,包括这些:
我仍然对如何在 VS2013 中以正确的方式传递 vector 以及此代码中以下方法之间的区别感到困惑(问题在注释中标记):
class Foo{
private:
std::vector<int> vect;
public:
//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}
//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}
//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}
//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}
//5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}
}
所以我不确定//1 是否是//2 的显式形式,不确定 3 是否有效。 4和5有什么区别?如何测试 RVO 是否适用于 VS2013 中的 vector ?
最佳答案
//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}
这太丑了,你仍然需要一个拷贝,而且你的界面太复杂了。
//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}
//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}
功能相同,但您可能希望 3 指示 getVect
不会更改您的类状态,因此可以正确应用 const
语义。
//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}
你似乎不太可能想要这个,在调用 GetVect
之后,内部 vect
将不再包含任何元素。
//5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}
这最终应该与 4 相同,您只需更明确地调用返回对象的移动构造函数即可。
对于性能,您可能真正想要的是:
const std::vector<int>& GetVect() const
{
return vect;
}
这样你就可以读取对象而不需要复制。如果要写入返回的 vector ,请显式创建一个拷贝。更多详细信息,请参阅 this question
关于c++ - 如何在 C++11 中返回类成员 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760475/
我是一名优秀的程序员,十分优秀!