`for_each`没有像我预期的那样工作

时间:2015-08-23 18:51:11

标签: c++ algorithm functional-programming bind

我正在使用函数式编程的一些功能,并试图为向量中的每个对象调用成员函数。到目前为止,这是我的代码。

  

emplace.cc

#include <iostream>
#include <vector>
#include <string>
#include <functional>

class Person {
   public:
      Person(std::string name, size_t age) : _name(name), _age(age) { std::cout << "Hello, " << getName() << std::endl; }
      ~Person() { std::cout << "Goodbye, "<< getName() << std::endl; }
      void greet() { std::cout << getName() << " says hello!" << std::endl; }
      std::string getName() const { return _name; }
   private:
      std::string _name;
      size_t _age;

};

int main()
{
   std::vector<Person> myVector;
   myVector.emplace_back("Hello", 21);
   myVector.emplace_back("World", 20);

   std::for_each(myVector.begin(), myVector.end(), std::bind1st(std::mem_fun(&Person::greet), this));
   return 0;
}

这段代码很可能存在问题,但对我来说很奇怪的是我 获得的两条错误消息。

emplace.cc:24:4: error: 'for_each' is not a member of 'std'
    std::for_each(myVector.begin(), myVector.end(), std::bind1st(std::mem_fun(&Person::greet), this));
    ^
emplace.cc:24:95: error: invalid use of 'this' in non-member function
    std::for_each(myVector.begin(), myVector.end(), std::bind1st(std::mem_fun(&Person::greet), this));
                                                                                               ^

我正在使用GCC 5.2.0与-std=c++14进行编译。

2 个答案:

答案 0 :(得分:5)

for_each位于<algorithm>

你可以做到

for_each(myVector.begin(), myVector.end(), [&] (const decltype(myVector.front())& a) { a.greet(); });

答案 1 :(得分:3)

首先,您忘记包含标题<algorithm>。并且您可能不会在此上下文中使用this

尝试以下

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>


class Person {
   public:
      Person(std::string name, size_t age) : _name(name), _age(age) { std::cout << "Hello, " << getName() << std::endl; }
      ~Person() { std::cout << "Goodbye, "<< getName() << std::endl; }
      void greet() { std::cout << getName() << " says hello!" << std::endl; }
      std::string getName() const { return _name; }
   private:
      std::string _name;
      size_t _age;

};

int main()
{
   std::vector<Person> myVector;
   myVector.emplace_back("Hello", 21);
   myVector.emplace_back("World", 20);

   std::for_each(myVector.begin(), myVector.end(), std::mem_fn( &Person::greet ) );
}

程序输出

Hello, Hello
Hello, World
Goodbye, Hello
Hello says hello!
World says hello!
Goodbye, World
Goodbye, Hello

如果在矢量定义

之后包含以下调用
std::vector<Person> myVector;
myVector.reserve( 2 );    

然后输出

Hello, Hello
Hello, World
Hello says hello!
World says hello!
Goodbye, World
Goodbye, Hello

即添加第二个元素时不会重新分配内存。