Aquí es un código de ejemplo:¿Los contenedores que pasan por valor invalidan los iteradores?
#include <iostream>
#include <vector>
template <typename T>
std::vector<typename T::iterator> f(T t)
{
std::vector<typename T::iterator> v;
for (auto i = t.begin(); i != t.end(); ++i)
{
v.push_back(i);
}
return v;
}
template <typename T>
void print(const std::vector<T>& v)
{
for (auto i = v.begin(); i != v.end(); ++i)
{
std::cout << **i << ' ';
}
std::cout << std::endl;
}
int main()
{
std::vector<int> v{1, 2, 3};
print(f(v));
std::vector<std::vector<int>::iterator> itervec = f(v);
print(itervec);
}
En ideone la salida fue:
1 2 3
163487776 2 3
Preguntas
Si cambio f(T t)
-f(T& t)
la salida es como se esperaba. Asumo que porque estoy trabajando con copias de contenedores, técnicamente los iteradores que estoy presionando sobre el vector no son lo mismo que el vector que creé en main. ¿Es esto correcto? Lo único que noté es print(f(v));
imprime 1 2 3
como se esperaba, pero tan pronto como lo asigno a itervec
, el primer iterador se convierte en basura, ¿todo esto depende de la implementación?