返回一个矢量对象的引用,好主意?

时间:2015-02-21 12:24:08

标签: c++

我需要一个3d矢量来存储一些瓷砖对象,而不是将矢量放在矢量内的矢量中我试过这个:

inside a struct
...
vector<sortTile3> data;
uint32_t width, length, height;

sortTile3& At(uint32_t x, uint32_t y, uint32_t z) {
    return data[x * width + y * length + z];
}
...

似乎工作正常,我认为也应该更快,因为如果我能弄清楚如何进行融合乘法加法,它将进行1次内存提取和4次计算或2次计算。

无论如何,我记得在这个网站上阅读有关返回引用不好的内容。我明白为什么......很多事情都可能出错,但不应该出现这种情况......或者?

2 个答案:

答案 0 :(得分:1)

这很好,很平常。返回引用的问题(主要是)函数本地对象。即:

struct foo {
  int data;

  // this is fine
  int &ref1() {
    return data;
  }

  // this is NOT fine
  int &ref2() {
    int localdata;
    return localdata;
  }
}

后者不正确的原因是localdatafoo::ref2离开时超出范围,然后返回的引用将不会引用有效对象。

通常,您必须注意不要将对象的引用保留的时间超过它们的生命周期,但是从成员函数返回对数据成员的引用没有任何内在错误。

例如,您可能已注意到std::vector operator[]返回对其成员的引用;你可以做同样的事情。但是,您必须小心不要将它们存储的时间超过它们保持有效的时间。例如:

std::vector<int> v(10);
int &r = v[0];
v.resize(20);

// r is no longer valid because v may have relocated its storage.

另请注意,有些事情只能通过返回引用来实现。例如,如果你想要能够做到

yourstruct.At(0, 1, 2).foo = bar;

并拥有更改棒,返回副本对您没用。

答案 1 :(得分:0)

如果存储引用(而不是暂时使用)可能会出现问题。当vector重新分配内存或vector中的项目移动(insert)或vector被删除时,引用将失效。如果在存储这些引用后不再修改vector,那么它将是安全的。

有关迭代器失效的信息,请参阅http://en.cppreference.com/w/cpp/container/vector