2009-02-09 2 views
14

У меня есть вектор целых чисел, и я хочу преобразовать его в вектор пар (пара состоит из 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])); 
    } 

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

ответ

15

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. EDIT: вот не-наддув решение:

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

4. EDIT: здесь раствор 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)); 
} 
+1

Th anks .. Я надеялся, что будет проще, чем делать это. Также вы можете отредактировать ответ, чтобы параметр, переданный конструктору, не был ссылкой на константу. Я не использую boost, поэтому я живу со стандартными алгоритмами STL. – Naveen

+0

Хороший вызов const, сила привычки по умолчанию для const :) –

+0

@patryk, для числа 4 - C++ 11 по-прежнему требует как позиции, так и значения в качестве аргумента для 'vector :: insert', не так ли ? (см., например, [здесь] (http://www.cplusplus.com/reference/vector/vector/insert/).) Вы имели в виду 'push_back()'? – phlummox