Because that's the way the interface is specified in the ```Element``` class.
The idea was that a face can unambiguously identify by at most 3 nodes, so we store the shared nodes of two elements in an std::array of size 3. The calculation of element neighbours is the most time-consuming part of a mesh initialisation so we decided that this would be the fastest solution. After identifying the face, the array is destroyed. Also, all these methods are protected so they cannot be accidentally used.