другой алгоритм копирования

У меня есть два вектора.

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

Эти два вектора заполнены и имеют одинаковый размер. Мне нужен какой-то алгоритм, который присваивает объектной переменной. Это может быть использование boost:: lambda. Скажем:

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

Любое предложение?


person sigidagi    schedule 06.10.2011    source источник


Ответы (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;
}


EDIT: другой вариант, если вы можете правильно определить 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());
}
person Robᵩ    schedule 06.10.2011
comment
+1 в конце концов. Я думаю, что std::transform имеет форму, которая должна применяться, но мой мозг находится в спящем режиме, поэтому я не могу это понять :) - person sehe; 06.10.2011
comment
transform немного сбивает с толку. Как насчет zip_for_each? - person Daniel Trebbien; 06.10.2011
comment
@DanielTrebbien - Как пожелаете. - person Robᵩ; 06.10.2011

Я думаю, что вы хотите 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;
}

Выходы:

Alpha
Beta
Gamma
person Daniel Trebbien    schedule 06.10.2011