If I define a pointer to an object that defines the []
operator, is there a direct way to access this operator from a pointer?
For example, in the follo
You could do any of the following:
#include <vector>
int main () {
std::vector<int> v(1,1);
std::vector<int>* p = &v;
p->operator[](0);
(*p)[0];
p[0][0];
}
By the way, in the particular case of std::vector
, you might also choose: p->at(0)
, even though it has a slightly different meaning.
return VecPtr->operator[](0);
...will do the trick. But really, the (*VecPtr)[0]
form looks nicer, doesn't it?
You can use it as VecPrt->operator [] ( 0 )
, but I'm not sure you'll find it less obscure.
(*VecPtr)[0]
is perfectly OK, but you can use the at
function if you want:
VecPtr->at(0);
Keep in mind that this (unlike operator[]
) will throw an std::out_of_range
exception if the index is not in range.
People are advising you to use ->at(0)
because of range checking. But here is my advise (with other point of view):
NEVER use ->at(0)
! It is really slower. Would you sacrifice performance just because you are lazy enough to not check range by yourself? If so, you should not be programming in C++.
I think (*VecPtr)[0]
is ok.
There's another way, you can use a reference to the object:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {7};
vector<int> *p = &v;
// Reference to the vector
vector<int> &r = *p;
cout << (*p)[0] << '\n'; // Prints 7
cout << r[0] << '\n'; // Prints 7
return 0;
}
This way, r
is the same as v
and you can substitute all occurrences of (*p)
by r
.
Caveat: This will only work if you won't modify the pointer (i.e. change which object it points to).
Consider the following:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {7};
vector<int> *p = &v;
// Reference to the vector
vector<int> &r = *p;
cout << (*p)[0] << '\n'; // Prints 7
cout << r[0] << '\n'; // Prints 7
// Caveat: When you change p, r is still the old *p (i.e. v)
vector<int> u = {3};
p = &u; // Doesn't change who r references
//r = u; // Wrong, see below why
cout << (*p)[0] << '\n'; // Prints 3
cout << r[0] << '\n'; // Prints 7
return 0;
}
r = u;
is wrong because you can't change references:
This will modify the vector referenced by r
(v
)
instead of referencing another vector (u
).
So, again, this only works if the pointer won't change while still using the reference.
The examples need C++11 only because of vector<int> ... = {...};