如何通过STL算法得到两个数组(向量)的组合?

发布于 2024-08-06 19:46:59 字数 412 浏览 1 评论 0原文

我有 v1v2 ,我应该如何获得如下所示的新 v

v1 = {1,2}
v2 = {3,4,5}

v = {f(1,3) , f(1,4) , f(1,5) f(2,3) ,f(2,4) ,f(2,5)}

我知道我可以使用两个循环来完成它,但是是否有更惯用的方法,例如使用 STL 算法?

//using two loops
for iter1 of v1 
     for iter2 of v2
           v.push_back(f(v1,v2))

编辑:

v1v2 不一定具有相同的大小。

I have v1 and v2 , how should I got a new v like below?

v1 = {1,2}
v2 = {3,4,5}

v = {f(1,3) , f(1,4) , f(1,5) f(2,3) ,f(2,4) ,f(2,5)}

I know I could do it using two loops, But If there is more idiomatic way like using STL algorithm?

//using two loops
for iter1 of v1 
     for iter2 of v2
           v.push_back(f(v1,v2))

EDIT:

v1 and v2 not necessary have same size.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世界等同你 2024-08-13 19:46:59

没有合适的 STL 算法,但可以通过自定义函数和 std::generate 来实现这种组合:

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

typedef int T;

struct Fctor
{
    typedef std::vector<T>::iterator Iterator;
    Iterator it1, it2, begin, end;

    Fctor(Iterator begin1, Iterator end1, Iterator begin2)
    {
        begin = begin1;
        end = end1;
        it1 = begin1;
        it2 = begin2;
    }

    T operator()()
    {
        // T result = f(*it1, *it2);
        T result = (*it1) * (*it2);

        if(++it1 != end) return result;
        it1 = begin;
        ++ it2;
        return result;
    }
};


int main()
{
    std::vector<T> v1; v1.push_back(1); v1.push_back(2);
    std::vector<T> v2; v2.push_back(3); v2.push_back(4); v2.push_back(5);
    std::vector<T> result(v1.size() * v2.size());

    Fctor fctor(v2.begin(), v2.end(), v1.begin());
    generate(result.begin(), result.end(), fctor);

    std::copy(result.begin(), result.end(), 
              std::ostream_iterator<T>(std::cout, " "));
    std::cout << std::endl;
    // => 3 4 5 6 8 10
}

There is no appropriate STL algorithm, but this combination possible to do by a custom function and std::generate:

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

typedef int T;

struct Fctor
{
    typedef std::vector<T>::iterator Iterator;
    Iterator it1, it2, begin, end;

    Fctor(Iterator begin1, Iterator end1, Iterator begin2)
    {
        begin = begin1;
        end = end1;
        it1 = begin1;
        it2 = begin2;
    }

    T operator()()
    {
        // T result = f(*it1, *it2);
        T result = (*it1) * (*it2);

        if(++it1 != end) return result;
        it1 = begin;
        ++ it2;
        return result;
    }
};


int main()
{
    std::vector<T> v1; v1.push_back(1); v1.push_back(2);
    std::vector<T> v2; v2.push_back(3); v2.push_back(4); v2.push_back(5);
    std::vector<T> result(v1.size() * v2.size());

    Fctor fctor(v2.begin(), v2.end(), v1.begin());
    generate(result.begin(), result.end(), fctor);

    std::copy(result.begin(), result.end(), 
              std::ostream_iterator<T>(std::cout, " "));
    std::cout << std::endl;
    // => 3 4 5 6 8 10
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文