#include <array>
#include <iostream>
#include <vector>
using vector3d = std::array<double, 3>;
class field
{
public:
// the explicit prevents std::size_t's to be implicitely cast into fields ;-)
explicit field(std::size_t size)
: vectors_(size)
{
}
vector3d & operator[] (std::size_t index) { return vectors_[index]; }
vector3d operator[] (std::size_t index) const { return vectors_[index]; }
private:
// this is pretty contigous
std::vector<vector3d> vectors_;
};
int main()
{
field f(2);
vector3d & v = f[1];
v[2] = 5;
// also: this is a copy of v, so changing v2 will not affect f[1][2]
vector3d v2 = v;
v2[2] = 2;
std::cout << f[1][2] << std::endl;
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyB2ZWN0b3IzZCA9IHN0ZDo6YXJyYXk8ZG91YmxlLCAzPjsKCmNsYXNzIGZpZWxkCnsKcHVibGljOgoJLy8gdGhlIGV4cGxpY2l0IHByZXZlbnRzIHN0ZDo6c2l6ZV90J3MgdG8gYmUgaW1wbGljaXRlbHkgY2FzdCBpbnRvIGZpZWxkcyA7LSkKCWV4cGxpY2l0IGZpZWxkKHN0ZDo6c2l6ZV90IHNpemUpCgkJOiB2ZWN0b3JzXyhzaXplKQoJewoJfQoJCgl2ZWN0b3IzZCAmIG9wZXJhdG9yW10gKHN0ZDo6c2l6ZV90IGluZGV4KSB7IHJldHVybiB2ZWN0b3JzX1tpbmRleF07IH0KCXZlY3RvcjNkIG9wZXJhdG9yW10gKHN0ZDo6c2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiB2ZWN0b3JzX1tpbmRleF07IH0KCQpwcml2YXRlOgoJLy8gdGhpcyBpcyBwcmV0dHkgY29udGlnb3VzCglzdGQ6OnZlY3Rvcjx2ZWN0b3IzZD4gdmVjdG9yc187Cn07CgppbnQgbWFpbigpCnsKICAgIGZpZWxkIGYoMik7CiAgICB2ZWN0b3IzZCAmIHYgPSBmWzFdOwogICAgdlsyXSA9IDU7CgoJLy8gYWxzbzogdGhpcyBpcyBhIGNvcHkgb2Ygdiwgc28gY2hhbmdpbmcgdjIgd2lsbCBub3QgYWZmZWN0IGZbMV1bMl0KICAgIHZlY3RvcjNkIHYyID0gdjsKICAgIHYyWzJdID0gMjsKCiAgICBzdGQ6OmNvdXQgPDwgZlsxXVsyXSA8PCBzdGQ6OmVuZGw7CgogICAgcmV0dXJuIDA7Cn0=