Как заполнить вектор итераторами другого типа? - PullRequest
1 голос
/ 02 декабря 2010

У меня есть много примеров следующего кода:

struct foo1
{
    foo1(int ii = 0, int jj = 0)
    {
        this->ii = ii;
        this->jj = jj;
    }

    int ii;
    int jj;
};

struct foo2
{
    foo2()
    {
    }

    foo2(const foo1& f)
    {
        this->f = f;
    }

    foo1 f;
};
typedef std::vector< foo2 > foo_v;

typedef std::set< int > bar_s;

bar_s barSet;
barSet.insert(1); barSet.insert(2); barSet.insert(3);
barSet.insert(4); barSet.insert(5); barSet.insert(6);

...

foo_v fooVec;
for (bar_s::iterator b = barSet.begin(); b != barSet.end(); ++b)
    fooVec.push_back(foo2(*b));

Как я могу улучшить код, где он заполняет новый вектор foo2?

Я думал что-то вроде:

std::remove_copy_if(barSet.begin(), barSet.end(), 
                    std::back_inserter(fooVec), ...)

но я изо всех сил пытаюсь найти способ привязать тип int к новым экземплярам структуры foo2.


Примечание:

std::copy(barSet.begin(), barSet.end(), std::back_inserter(fooVec));

выдает мне следующую ошибку:

Ошибка 1, ошибка C2679: двоичный файл '=': не найден оператор, который принимает правый операнд типа 'int' (или нет допустимого преобразования)

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010
std::copy(barSet.begin(), barSet.end(), std::back_inserter(fooVec));

int конвертируется в `foo '(единственный конструктор может быть вызван с одним аргументом int, и он не является явным).

Ошибка 1, ошибка C2679: двоичный файл «=»: не найден оператор, который принимает правый операнд типа «int» (или нет приемлемого преобразования)

Это потому, что foo2 не может быть создан из int, только из foo1 и допускается только один шаг неявного преобразования. Вы можете std :: transform:

std::transform(barSet.begin(), barSet.end(), 
               std::back_inserter(fooVec), 
               boost::lambda::constructor<foo2>());

boost :: lambda :: constructor () можно заменить на std :: fun_ptr (makeFoo2):

foo2 makeFoo2(const foo& f) { return f; }
0 голосов
/ 02 декабря 2010

Вы можете использовать конструктор вектора, который принимает пару итераторов.

foo_v fooVec(barSet.begin(), barSet.end());

Учитывая, что конструкторы foo, int неявно преобразуются в foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...