使用变换创建新向量

问题描述 投票:0回答:2

我有一个整数向量,我想将其转换为对向量(对由 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]));
    }

有什么办法可以做到这一点而不需要自己编写循环吗?可能使用一些算法?

c++ stl
2个回答
22
投票

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);
}

3.编辑:这是一个非增强解决方案:

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

2.编辑:我想你也许可以使用带有后插入器和转换的绑定。像这样的:

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

我用

std::bind1st
尝试过这个,我认为它应该有效,但我只能用
boost::bind
让它成功。我会继续努力的...

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
来完成一些事情。


1
投票

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

#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";
    }
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.