Создание нового вектора с использованием преобразования - PullRequest
16 голосов
/ 09 февраля 2009

У меня есть вектор целых чисел, и я хочу преобразовать его в вектор пар (пара состоит из bool и int) Мой текущий код очень прост:

    std::vector<int> a;
    std::vector<std::pair<bool,int> > b;

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    for(int i = 0; i < a.size(); ++i)
    {
        b.push_back(std::make_pair(false, a[i]));
    }

Есть ли способ сделать это без написания самого цикла? Возможно, с использованием некоторых алгоритмов?

1 Ответ

16 голосов
/ 09 февраля 2009

1. Вы можете сделать функтор и std::for_each:

struct F {
    F(std::vector<std::pair<bool,int> > &b) : m_b(b){
    }

    void operator()(int x) {
        m_b.push_back(std::make_pair(false, x));
    }

    std::vector<std::pair<bool,int> > &m_b;
};

std::for_each(a.begin(), a.end(), F(b));

Хотя это может оказаться больше проблем, чем оно того стоит. Но по крайней мере это будет многоразово:).

Может быть, есть что-то, что можно сделать с boost::bind.

2. РЕДАКТИРОВАТЬ: Я думал, что вы могли бы использовать связывание с задней вставкой и преобразования. как то так:

std::transform(a.begin(), a.end(), std::back_inserter(b), boost::bind(std::make_pair<bool, int>, false, _1));

Я попробовал это с std::bind1st, я думал, что это должно сработать, но я смог добиться успеха только с boost::bind. Я буду продолжать пытаться ...

3. РЕДАКТИРОВАТЬ: вот решение без повышения:

std::transform(a.begin(), a.end(), std::back_inserter(b), std::bind1st(std::ptr_fun(std::make_pair<bool, int>), false));

4. РЕДАКТИРОВАТЬ: вот решение C ++ 11 (которое сейчас мое любимое):

std::for_each(begin(a), end(a), [&b](int v) {
    b.push_back(std::make_pair(false, v));
});

или даже проще:

for(int v : a) {
    b.push_back(std::make_pair(false, v));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...