【问题标题】:const reference of std::vector [duplicate]std::vector 的常量引用 [重复]
【发布时间】:2018-05-20 17:02:10
【问题描述】:

对于我的一个函数,cppcheck 返回: 参数'neighbors'按值传递。它可以作为 (const) 引用传递,这在 C++ 中通常更快且推荐使用。

我知道在可以传递引用时两次分配向量是没有意义的,但我真的不知道该怎么做...... 我在这里尝试了很多类似的答案,但我找不到真正适合我的问题的答案。

类向量矩阵

此函数获取所有邻居并将它们存储在一个

std::vector<Cell*> vectorMatrix::getCellNeighbors(int x, int y) {
    std::vector<Cell*> neighbors;
    return neighbors;
}

此函数将每个单元格的邻居传递给单元格(存储它们以便快速访问...每次点击都需要它们)

  void vectorMatrix::initCells()
  {
    for (int x = 0; x < _rows; x++)
    {
      for (int y = 0; y < _columns; y++)
      {
        _cellMatrix[x][y]->setNeighbors(getCellNeighbors(x, y));
      }
    }
  }

类单元

HXX

std::vector<Cell*> _neighbors;

CXX

void Cell::setNeighbors(std::vector<Cell*> neighbors)
{
  _neighbors = neighbors;
}  

。)我如何正确地将向量作为(const?)引用传递。 .) 这段代码有效吗?在每个单元格内存储对所有邻居的引用是否有意义? (地图尺寸最大可达 256x256,每个图块都是一个对象)

完整的代码可以在这里找到: https://github.com/JimmySnails/IsometricEngine

【问题讨论】:

  • const_cast&lt;const std::vector&lt;Cell*&gt;&gt; : 这是你想要的吗?
  • 我想要一个详细的答案,这不足以让我理解如何传递 const refs...
  • 我要求澄清一下。无论如何,您想要一个恒定向量还是恒定单元的向量?还是常数单元的常数向量?
  • 你的函数 ccpCheck 看起来如何?您的 getCellNeighbors 不是“正确的”,因为它只是返回一个局部变量,只是被复制,也许那里还有其他代码,没有显示?。
  • 哦,对不起。根据 cppcheck,向量本身应该是一个 const 引用。现在我想到了,里面的 Cell* 可能是不变的,因为它们不会改变。这对性能有帮助还是只是为了“安全”

标签: c++ vector reference


【解决方案1】:

我是一名 Cppcheck 开发人员。

我相信这段代码:

void Cell::setNeighbors(std::vector<Cell*> neighbors)
{
  _neighbors = neighbors;
}

应改为:

void Cell::setNeighbors(const std::vector<Cell*> &neighbors)
{
  _neighbors = neighbors;
}

【讨论】:

  • 您的检查器似乎有点过时了。您的“修复”节省了几乎没有成本的一步,但仍然需要副本。在 C++11 及更高版本中,更快 的方法是void Cell::setNeighbors(std::vector&lt;Cell*&gt; neighbors) { _neighbors = std::move(neighbors); },它需要 个副本(和两次移动)。即使在 C++03 中,写 void Cell::setNeighbors(std::vector&lt;Cell*&gt; neighbors) { _neighbors.swap(neighbors); } 也一样好
  • 谢谢你们。 std::move(neighbors) 工作,甚至为 128 x 128 瓦片将我的代码加快了约 50 毫秒! std::move 是否足够,或者还有什么我应该考虑的吗?
  • 感谢@BenVoigt 的反馈。是的,它似乎“有点过时”。对于二传手,我们可能应该开始推荐std::move()。但是我认为 const 引用在许多其他情况下更好。如果你只是想遍历元素并做一些事情,那么移动/复制不是一个好主意。
  • 有关信息,我添加了trac.cppcheck.net/ticket/8590,以便 Cppcheck 将来会提出更好的建议..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2012-08-02
相关资源
最近更新 更多