std::advance y std::next se utilizan para avanzar el iterador en una determinada posición, de modo que podamos hacer que el iterador apunte a la posición deseada. Aunque ambos tienen el mismo propósito, pero su implementación es diferente entre sí. Esto hace que sea importante para nosotros entender la diferencia entre los dos. En C++11, std::next() avanzará en uno de forma predeterminada, mientras que std::advance() requiere una distancia .
- Diferencia sintáctica: la sintaxis de std::advance y std::next es:
// Definition of std::advance() template void advance( InputIt& it, Distance n ); it: Iterator to be advanced n: Distance to be advanced
// Definition of std::next() ForwardIterator next (ForwardIterator it, typename iterator_traits::difference_type n = 1); it: Iterator pointing to base position n: Distance to be advanced from base position.
- Tipo de devolución: std::advance no devuelve nada, mientras que std::next devuelve un iterador después de avanzar n posiciones desde la posición base dada.
- Como en la sintaxis de std::next() , al menos avanzará el iterador una posición , incluso si no especificamos la posición que tiene que avanzar ya que tiene un valor predeterminado uno, mientras que si usamos std: :advance , no tiene ese argumento predeterminado.
- Laboral
- Modificación de argumentos: std::advance modifica sus argumentos para que apunte a la posición deseada, mientras que std::next no modifica su argumento, de hecho devuelve un nuevo iterador que apunta a la posición deseada.
CPP
// C++ program to demonstrate // std::advance vs std::next #include <iostream> #include <iterator> #include <deque> #include <algorithm> using namespace std; int main() { // Declaring first container deque<int> v1 = { 1, 2, 3 }; // Declaring second container for // copying values deque<int> v2 = { 4, 5, 6 }; deque<int>::iterator ii; ii = v1.begin(); // ii points to 1 in v1 deque<int>::iterator iii; iii = std::next(ii, 2); // ii not modified // For std::advance // std::advance(ii, 2) // ii modified and now points to 3 // Using copy() std::copy(ii, iii, std::back_inserter(v2)); // v2 now contains 4 5 6 1 2 // Displaying v1 and v2 cout << "v1 = "; int i; for (i = 0; i < 3; ++i) { cout << v1[i] << " "; } cout << "\nv2 = "; for (i = 0; i < 5; ++i) { cout << v2[i] << " "; } return 0; }
- Producción:
v1 = 1 2 3 v2 = 4 5 6 1 2
- Explicación: Como se puede ver, queremos hacer que ii apunte a 2 espacios por delante de donde apunta, por lo que si usamos std::advance ii apuntará a dos espacios por delante, mientras que si usamos std::next, entonces ii no avanzará, pero se devolverá un iterador que apunta a la nueva posición y se almacenará en iii.
- Requisito previo: std::next requiere que el iterador pasado como argumento sea del tipo al menos iterador hacia adelante , mientras que std::advance no tiene tales restricciones, ya que puede funcionar con cualquier iterador, incluso con iterador de entrada o mejor que él.
Veamos las diferencias en forma tabular -:
estándar::siguiente | estándar::avanzado | |
1. | Se utiliza para devolver el enésimo sucesor de un iterador. | No tiene ningún tipo de retorno. |
2. | Toma dos parámetros que son -: número de elementos y un iterador. | Toma dos parámetros número de elementos e iterador |
3. | Su complejidad de tiempo en el mejor de los casos es constante. | Su complejidad de tiempo en el mejor de los casos es constante. |
4. | Su complejidad de tiempo en el peor de los casos es lineal. | Su complejidad de tiempo en el peor de los casos es lineal. |
Este artículo es una contribución de Mrigendra Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA