Convert iterator to pointer?
Solution 1
That seems not possible in my situation, since the function I mentioned is the find function of
unordered_set<std::vector*>
.
Are you using custom hash/predicate function objects? If not, then you must pass unordered_set<std::vector<int>*>::find()
the pointer to the exact vector that you want to find. A pointer to another vector with the same contents will not work. This is not very useful for lookups, to say the least.
Using unordered_set<std::vector<int> >
would be better, because then you could perform lookups by value. I think that would also require a custom hash function object because hash
does not to my knowledge have a specialization for vector<int>
.
Either way, a pointer into the middle of a vector is not itself a vector, as others have explained. You cannot convert an iterator into a pointer to vector without copying its contents.
Solution 2
here it is, obtaining a reference to the coresponding pointer of an iterator use :
example:
string my_str= "hello world";
string::iterator it(my_str.begin());
char* pointer_inside_buffer=&(*it); //<--
[notice operator * returns a reference so doing & on a reference will give you the address].
Solution 3
If you can, a better choice may be to change the function to take either an iterator to an element or a brand new vector (if it does not modify).
While you can do this sort of things with arrays since you know how they are stored, it's probably a bad idea to do the same with vectors. &foo[1]
does not have the type vector<int>*
.
Also, while the STL implementation is available online, it's usually risky to try and rely on the internal structure of an abstraction.
Solution 4
A vector is a container with full ownership of it's elements. One vector cannot hold a partial view of another, even a const-view. That's the root cause here.
If you need that, make your own container that has views with weak_ptr's to the data, or look at ranges. Pair of iterators (even pointers work well as iterators into a vector) or, even better, boost::iterator_range that work pretty seamlessly.
It depends on the templatability of your code. Use std::pair if you need to hide the code in a cpp.
Solution 5
Your function shouldn't take vector<int>*
; it should take vector<int>::iterator
or vector<int>::const_iterator
as appropriate. Then, just pass in foo.begin() + 1
.
Frank
Updated on April 04, 2021Comments
-
Frank about 3 years
I have a
std::vector
withn
elements. Now I need to pass a pointer to a vector that has the lastn-1
elements to a function.For example, my
vector<int> foo
contains(5,2,6,87,251)
. A function takesvector<int>*
and I want to pass it a pointer to(2,6,87,251)
.Can I just (safely) take the iterator
++foo.begin()
, convert it to a pointer and pass that to the function? Or use&foo[1]
?UPDATE: People suggest that I change my function to take an iterator rather than a pointer. That seems not possible in my situation, since the function I mentioned is the
find
function ofunordered_set<std::vector*>
. So in that case, is copying then-1
elements fromfoo
into a new vector and callingfind
with a pointer to that the only option? Very inefficient! It's like Shlemiel the painter, especially since i have to query many subsets: the lastn-1
, thenn-2
, etc. elements and see if they are in theunordered_set
.