En C++, ¿hay alguna manera de invocar una función en cada elemento de un vector, sin utilizar un bucle que se ejecute sobre todos los elementos del vector? Algo similar a un 'mapa' en Python.Llamar a una función en cada elemento de un vector de C++
Respuesta
Sí: std::for_each
.
void foo(int a) {
std::cout << a << "\n";
}
std::vector<int> v;
...
std::for_each(v.begin(), v.end(), &foo);
Puede utilizar std::for_each que tiene un par de iteradores y una función o funtor.
Uso for_each
:
// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void myfunction (int i) {
cout << " " << i;
}
struct myclass {
void operator() (int i) {cout << " " << i;}
} myobject;
int main() {
vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myfunction);
// or:
cout << "\nmyvector contains:";
for_each (myvector.begin(), myvector.end(), myobject);
cout << endl;
return 0;
}
Si tiene C++ 11, hay un método aún más corto: ranged-based for. Su propósito es exactamente esto.
std::vector<int> v {1,2,3,4,5};
for (int element : v)
std::cout << element; //prints 12345
También puede aplicar referencias e incorporarlas también, según corresponda, o usar auto cuando el tipo es largo.
std::vector<std::vector<int>> v {{1,2,3},{4,5,6}};
for (const auto &vec : v)
{
for (int element : vec)
cout << element;
cout << '\n';
}
Salida:
123
456
Esta sintaxis aún no es compatible con vs2011, por ejemplo. Al menos no mi copia. Pero más +1. – ervinbosenbacher
@xebo, ah, eso apesta ya que esta es una de las mejores características de C++ 11 imo. – chris
Para cualquier visitante futuro, se ha agregado ranged-for a Visual Studio 2012. – chris
En C++ 11: Se puede usar un lambda. Por ejemplo:
std::vector<int> nums{3, 4, 2, 9, 15, 267};
std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });
De hecho, una buena solución si se ha extendido no está disponible. – chris
si ya recibió varias respuestas mencionar std::for_each
.
Mientras que éstos responden a la pregunta con lo solicitado, me gustaría añadir que, al menos en mi experiencia, es std::for_each
sobre la menos útil de los algoritmos estándar.
que utiliza (por ejemplo) std::transform
, que es básicamente a[i] = f(b[i]);
o result[i] = f(a[i], b[i]);
mucha más frecuencia que std::for_each
. Muchas personas usan con frecuencia std::for_each
para imprimir elementos de una colección; para ese propósito, std::copy
con un std::ostream_iterator
ya que el destino funciona mucho mejor.
Esta es la respuesta que estaba buscando, 'transform' está más cerca del' map' de Python que 'for_each', ya que' map' genera una lista de salidas, mientras que 'for_each' llama a una función pero descarta las salidas. –
- 1. Llamar a una función miembro de cada elemento de un vector C++
- 2. Llamar a una función cada 60 segundos
- 3. Llamar a una función cada 10 minutos
- 4. Extraiga cada elemento enésimo de un vector
- 5. C#/Linq: ¿Aplicar una función de mapeo a cada elemento en un IEnumerable?
- 6. Cómo pegar una cadena en cada elemento de un vector de cadenas usando apply en R?
- 7. ¿Cómo puedo llamar a un método en cada elemento de una lista?
- 8. ¿Llamar a la función int() en cada elemento de la lista?
- 9. un vector dinámico de C a R
- 10. Llamar a una función de una cadena en C#
- 11. ¿Se puede llamar a una función estática a través de un puntero de función en C?
- 12. pasar argumentos a una función en un único vector
- 13. Llamar a una función MATLAB desde C#
- 14. Llamar a una función de biblioteca C++ en vimscript
- 15. ¿Cómo pasar un vector a una función?
- 16. ¿Cómo puedo llamar a una función de SQL en C#?
- 17. ¿Cómo restar un vector de cada fila de una matriz?
- 18. C++: Llamar a la función virtual de la clase derivada
- 19. ¿Hay una función R para encontrar el índice de un elemento en un vector?
- 20. Llamar a una función de JavaScript de C++
- 21. ¿Cómo seleccionar un elemento de cada columna de una matriz en matlab?
- 22. ¿Cuál es la forma oficial de llamar a una función (C/C++) en ab. cada 1/100 seg en Linux?
- 23. ¿Pasa cada elemento de una lista a una función que toma múltiples argumentos en Python?
- 24. C#: Alteración de valores para cada elemento en una matriz
- 25. WebKit.NET para llamar a una función de C# desde JavaScript
- 26. cómo llamar dinámicamente una función en C#
- 27. clase de Padres C++ llamar a una función virtual niño
- 28. Llamar a un orden superior F # función de C#
- 29. ¿Cómo llamar a una función java de python/numpy?
- 30. Aplicar una función a cada fila de una matriz o un marco de datos
¿se esperaría que las mejoras de velocidad usen esto (a diferencia del bucle)? – dbliss
@dbliss, la implementación de 'for_each()' probablemente sea un bucle y, como usa plantillas, no debería haber diferencia. Sin embargo, con C++ 17, pueden introducir el paralelismo que sería totalmente transparente para usted y muy bien podría terminar más rápido. –