С ++ преобразование с парой получить ошибку сегментации - PullRequest
2 голосов
/ 05 марта 2010

Этот код работает:

class Test
{
public:
  Test(string name) : _name(name) {};
  bool operator()() { cout << "hello " << _name << endl; return true; }
  string name() { return _name; }
private:
  string _name;
};

pair<string, bool>
inline execute_test(Test* t) {
  return pair<string, bool>(t->name(), (*t)());
}

int main()
{
  vector<Test*> tests;
  vector<pair<string, bool> > results;
  tests.push_back(new Test("Test1"));
  tests.push_back(new Test("Test2"));

  for (unsigned int i=0; i < tests.size(); ++i)
      results.push_back(execute_test(tests[i]));

}

теперь я хочу использовать trasform вместо for cicle:

transform(tests.begin(), tests.end(),
          results.begin(),
          execute_test);

но у меня ошибка сегментации. Где проблема?

1 Ответ

9 голосов
/ 05 марта 2010

Это связано с тем, что transform ожидает, что results объекту будет выделена необходимая память, т. Е. Он ожидает, что results.size() как минимум равен tests.size(). Если вы хотите, чтобы операция push_back выполнялась на results, вам следует использовать std::back_inserter(results) в качестве третьего аргумента. В противном случае, когда transform использует переданный итератор вывода *, это будет неверное расположение в памяти и приведет к ошибке сегментации.

...