2

このコードは機能します:

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]));

}

forcicleの代わりにtrasformを使用したいと思います。

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

しかし、セグメンテーション違反が発生しました。問題はどこだ?

4

1 に答える 1

9

これは、オブジェクトに必要なメモリが割り当てられていることtransformを期待しているためです。つまり、少なくとも。と同じ大きさであることが期待されているためです。でpush_back操作を実行する場合は、3番目の引数として使用する必要があります。そうしないと、渡した出力イテレータを使用すると、メモリの場所が無効になり、セグメンテーション違反が発生します。resultsresults.size()tests.size()resultsstd::back_inserter(results)transform*

于 2010-03-05T11:17:52.183 に答える