C++ 使用变换创建新向量

C++ 使用变换创建新向量,c++,stl,C++,Stl,我有一个整数向量,我想把它转换成一个对向量(对由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) {

我有一个整数向量,我想把它转换成一个对向量(对由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]));
    }
std::transform(a.begin(), a.end(), std::back_inserter(b), boost::bind(std::make_pair<bool, int>, false, _1));
std::向量a;
std::载体b;
a、 推回(1);
a、 推回(2);
a、 推回(3);
对于(int i=0;i

有没有办法不用自己写循环就能做到这一点?可能使用了一些算法?

1。您可以创建一个函子,并为每个函子创建一个
std::for_

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));
我用
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));
或者更简单:

for(int v : a) {
    b.emplace_back(false, v);
}

没什么特别的。只是一个我喜欢的两行解决方案:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int>                  a{1,2,3,4,15};
    std::vector<std::pair<bool, int>> b;

    auto it = a.begin();
    std::generate_n(std::back_inserter(b), a.size(), [&it]() { return std::make_pair(false, *it++); });

    for(auto c : b) {
        std::cout << std::boolalpha << c.first << " " << c.second << "\n";
    }
}

#包括

谢谢..我希望有比这更简单的方法。。还可以编辑答案,以便传递给构造函数的参数不是常量引用。我没有使用boost,所以我一直使用标准STL算法。对const的调用很好,习惯的力量默认为const:)@patryk,对于数字4-C++11仍然需要一个位置和一个值作为
vector::insert
的参数,不是吗?(参见例如…)您的意思是
向后推()
#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int>                  a{1,2,3,4,15};
    std::vector<std::pair<bool, int>> b;

    auto it = a.begin();
    std::generate_n(std::back_inserter(b), a.size(), [&it]() { return std::make_pair(false, *it++); });

    for(auto c : b) {
        std::cout << std::boolalpha << c.first << " " << c.second << "\n";
    }
}