【问题标题】:another copy algorithm另一种复制算法
【发布时间】:2011-10-06 15:01:01
【问题描述】:

我有两个向量。

vector<Object> objects;
vector<string> names;

这两个向量被填充并且具有相同的大小。 我需要一些算法来分配对象变量。它可能正在使用 boost::lambda。 比方说:

some_algoritm(objects.begin(), objects.end(), names.begin(), bind(&Object::Name, _1) = _2);

有什么建议吗?

【问题讨论】:

    标签: c++ boost stl boost-lambda


    【解决方案1】:

    我认为您想要std::for_each,因为每个Object 实例都在就地修改:

    std::vector<std::string>::const_iterator names_it = static_cast<const std::vector<std::string>&>(names).begin();
    
    std::for_each(objects.begin(), objects.end(),
                  boost::lambda::bind(&Object::Name, boost::lambda::_1) = *boost::lambda::var(names_it)++);
    

    这是一个完整的、可编译的示例:

    #include <algorithm>
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <vector>
    #include <boost/lambda/bind.hpp>
    #include <boost/lambda/lambda.hpp>
    
    class Object
    {
    public:
        std::string Name;
    
        Object(const std::string& Name_ = "")
            : Name(Name_)
        {
        }
    };
    
    int main()
    {
        std::vector<Object> objects(3, Object());
        std::vector<std::string> names;
        names.push_back("Alpha");
        names.push_back("Beta");
        names.push_back("Gamma");
        std::vector<std::string>::const_iterator names_it = static_cast<const std::vector<std::string>&>(names).begin();
    
        std::for_each(objects.begin(), objects.end(), boost::lambda::bind(&Object::Name, boost::lambda::_1) = *boost::lambda::var(names_it)++);
    
        std::vector<Object>::iterator it, end = objects.end();
        for (it = objects.begin(); it != end; ++it) {
            std::cout << it->Name << std::endl;
        }
    
        return EXIT_SUCCESS;
    }
    

    输出:

    Α 贝塔 伽玛

    【讨论】:

      【解决方案2】:

      我想不出一个std:: 算法来解决这个问题。但是,您始终可以自己编写:

      template < class It1, class It2, class Operator >
        It2 zip_for_each ( It1 first1, It1 last1,
                               It2 result, Operator op )
      {
        while (first1 != last1)
          op(*first++, *result++);
        return result;
      }
      


      编辑:如果您能够适当地定义operator=,另一种选择是std::copy
      #include <vector>
      #include <string>
      
      struct Object {
        std::string name;
        int i;
        void operator=(const std::string& str) { name = str; }
      };
      
      int main () {
        std::vector<Object> objects(3);
        std::vector<std::string> names(3);
      
        names[0] = "Able";
        names[1] = "Baker";
        names[2] = "Charlie";
      
        std::copy(names.begin(), names.end(), objects.begin());
      }
      

      【讨论】:

      • 毕竟+1。我认为 std::transform 有一个应该应用的形式,但我的大脑处于休眠模式,所以我无法解决:)
      • transform 有点令人困惑。 zip_for_each 怎么样?
      • @DanielTrebbien - 如你所愿。
      猜你喜欢
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2017-04-22
      • 2011-06-23
      • 2016-03-15
      相关资源
      最近更新 更多