c++ - 使用变换创建新 vector

标签 c++ stl

我有一个整数 vector ,我想将其转换为对 vector (对由 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. 你可以制作一个仿函数和 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));

尽管这可能会带来更多的麻烦而不是它的值(value)。但至少它可以重复使用:)。

也许可以用 boost::bind 来做一些事情。

2. 编辑:我在想您也许可以将绑定(bind)与反向插入器和转换一起使用。像这样:

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.emplace_back(false, v);
});

甚至更简单:

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

关于c++ - 使用变换创建新 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527166/

相关文章:

c++ - -fomit-frame-pointer,使用它安全吗?

c++ - 如何交换 map 元素

c++ - 删除 C++ 映射中的指针

c++ - 在结构的 STL 映射中,为什么 "[ ]"运算符会导致结构的 dtor 被额外调用 2 次?

c++ - opencv 文件中缺少所需的架构 x86_64

c++ - 如何插入数组? C++

c++ - 为什么我们需要 remove_copy_if?

c++ - 如何使用 C++ 将点拟合到曲线?

c++ - 使用 std::sort() 对对象 vector 进行排序

c++ - 是否可以使用 `std::set_intersection` 来检查两个集合是否有任何共同元素?