设置 returns 对 std:vector 的引用但有时默认为空的函数的最有效(或最佳实践)方法是什么?
What is the most efficient (or just best practice) way to set up a function that returns a reference to an std:vector but sometimes a default empty?
采用以下函数(显然不能编译)。
const std::vector<int>& getMyVector()
{
if (something)
return std::vector<int>();
if (somethingElse)
return m_myVector;
return std::vector<int>();
}
假设 m_myVector 很大,或者不适合通过副本 returned,因此必须通过引用 returned。
构建代码以允许此逻辑同时还允许通过引用 return 的最有效方法是什么?我可以看到两个选项。第一个是将其更改为 return 指向向量的指针而不是引用,然后 return null 而不是空向量。另一个是有一个 static const 空向量和 return 那个。我不是特别喜欢这两个选项,所以我想知道是否有更好的方法。
编辑:请不要将示例函数用作我要说明的内容的文字表示。关键是我有一个函数可以 return 一个充满数据的真实向量,或者它可以 return 一个基于特定条件的默认空向量。另外,如果重要的话,我的真实代码甚至不是 return 一个简单的成员变量,它是一个存储在 hash_map.
中的向量
尽管您犹豫不决,我还是建议您在定义 m_myVector
.
的任何地方定义一个 static
空结果向量
std::vector<int> m_myVector;
static const std::vector<int> m_emptyResult;
然后您的代码既可以编译又可以避免复制。
const std::vector<int>& getMyVector()
{
if (something)
return m_emptyResult;
if (somethingElse)
return m_myVector;
return m_emptyResult;
}
或更简洁地说:
const std::vector<int>& getMyVector()
{
if ( !something && somethingElse )
return m_myVector;
return m_emptyResult;
}
采用以下函数(显然不能编译)。
const std::vector<int>& getMyVector()
{
if (something)
return std::vector<int>();
if (somethingElse)
return m_myVector;
return std::vector<int>();
}
假设 m_myVector 很大,或者不适合通过副本 returned,因此必须通过引用 returned。
构建代码以允许此逻辑同时还允许通过引用 return 的最有效方法是什么?我可以看到两个选项。第一个是将其更改为 return 指向向量的指针而不是引用,然后 return null 而不是空向量。另一个是有一个 static const 空向量和 return 那个。我不是特别喜欢这两个选项,所以我想知道是否有更好的方法。
编辑:请不要将示例函数用作我要说明的内容的文字表示。关键是我有一个函数可以 return 一个充满数据的真实向量,或者它可以 return 一个基于特定条件的默认空向量。另外,如果重要的话,我的真实代码甚至不是 return 一个简单的成员变量,它是一个存储在 hash_map.
中的向量尽管您犹豫不决,我还是建议您在定义 m_myVector
.
static
空结果向量
std::vector<int> m_myVector;
static const std::vector<int> m_emptyResult;
然后您的代码既可以编译又可以避免复制。
const std::vector<int>& getMyVector()
{
if (something)
return m_emptyResult;
if (somethingElse)
return m_myVector;
return m_emptyResult;
}
或更简洁地说:
const std::vector<int>& getMyVector()
{
if ( !something && somethingElse )
return m_myVector;
return m_emptyResult;
}