我需要一个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次计算。
无论如何,我记得在这个网站上阅读有关返回引用不好的内容。我明白为什么......很多事情都可能出错,但不应该出现这种情况......或者?
答案 0 :(得分:1)
这很好,很平常。返回引用的问题(主要是)函数本地对象。即:
struct foo {
int data;
// this is fine
int &ref1() {
return data;
}
// this is NOT fine
int &ref2() {
int localdata;
return localdata;
}
}
后者不正确的原因是localdata
在foo::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。