Вызов функции для каждого элемента вектора C ++

Самый простой ответ - не пытаться это сделать. Вместо этого, ваши миграции Alembic представляют собой полный макет базы данных. Затем любые сделанные вами миграции будут основываться на изменениях в существующей базе данных.

Чтобы сделать начальную миграцию, если у вас уже есть база данных, временно указывайте на пустую базу данных и запустите alembic revision --autogenerate -m "base". Затем, вернитесь к фактической базе данных и запустите alembic stamp head, чтобы сказать, что текущее состояние базы данных представлено последней миграцией, фактически не запуская ее.

Если вы не хотите этого делать по какой-то причине вы можете не использовать --autogenerate и вместо этого создавать пустые ревизии, которые вы заполняете с помощью операций, которые вы хотите. Alembic не остановит вас от этого, это гораздо менее удобно.

29
задан vikaspraj 9 May 2012 в 12:49
поделиться

7 ответов

Да: std::for_each .

void foo(int a) {
    std::cout << a << "\n";
}

std::vector<int> v;

...

std::for_each(v.begin(), v.end(), &foo);
39
ответ дан Oliver Charlesworth 9 May 2012 в 12:49
поделиться

На C ++ 11: вы можете использовать лямбду. Например:

std::vector<int> nums{3, 4, 2, 9, 15, 267};

std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });

ссылка: http://en.cppreference.com/w/cpp/algorithm/for_each

15
ответ дан Indy9000 9 May 2012 в 12:49
поделиться

Вы можете использовать std :: for_each , который принимает пару итераторов и функцию или функтор.

2
ответ дан juanchopanza 9 May 2012 в 12:49
поделиться

Если у вас есть C ++ 11, есть еще более короткий метод: ранжированный для . Его цель именно это.

std::vector<int> v {1,2,3,4,5};

for (int element : v)
    std::cout << element; //prints 12345

Вы также можете применять ссылки и const к нему, когда это уместно, или использовать auto, когда тип long.

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';
} 

Выход:

123
456
7
ответ дан chris 9 May 2012 в 12:49
поделиться

Используйте 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;
}
8
ответ дан Alexander Poluektov 9 May 2012 в 12:49
поделиться

Вы уже получили несколько ответов, в которых упоминается std::for_each.

Хотя они отвечают на вопрос, который вы задали, я бы добавил, что, по крайней мере, по моему опыту, std::for_each - это минимум , полезный из стандартных алгоритмов.

Я использую (для одного примера) std::transform, что в основном a[i] = f(b[i]); или result[i] = f(a[i], b[i]); гораздо чаще, чем std::for_each. Многие люди часто используют std::for_each для печати элементов коллекции; для этого std::copy с std::ostream_iterator в качестве пункта назначения работает намного лучше.

36
ответ дан Jerry Coffin 9 May 2012 в 12:49
поделиться

ОП упоминает функцию map в Python. Эта функция фактически применяет функцию к каждому элементу списка (или повторяемого) и возвращает список (или повторяемый), который собирает все результаты. Другими словами, он делает что-то вроде этого:

def f( x ) : 
   """ a function that computes something with x"""
   # code here 
   return y 

input = [ x1, x2, x3, ... ]
output = map( func, input )  

# output is  now [ f(x1), f(x2), f(x3), ...] 

Следовательно, ближайшая стандартная библиотека C ++, эквивалентная карте Python, на самом деле std::transform (из заголовка). 117]

Пример использования выглядит следующим образом:

#include <vector>
#include <algorithm> 
using namespace std;

double f( int x ) { 
   // a function that computes the square of x divided by 2.0 
   return x * x / 2.0 ;
}

int main( ) {
  vector<int> input{ 1, 5, 10 , 20};
  vector<double> output;
  output.resize( input.size() ); // unfortunately this is necessary

  std::transform( input.begin(), input.end(), output.begin(), f );

  // output now contains  { f(1), f(5), f(10), f(20) }
  //                     = { 0.5, 12.5,  50.0, 200.0 } 
  return 0;
}   
0
ответ дан Mateo 9 May 2012 в 12:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: