加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

交叉产品c

发布时间:2020-12-16 10:23:26 所属栏目:百科 来源:网络整理
导读:鉴于以下 Python(从 http://norvig.com/sudoku.html) def cross(A,B): "Cross product of elements in A and elements in B." return [a+b for a in A for b in B]cols = '123456789'rows = 'ABCDEFGHI'squares = cross(rows,cols) 这会产生: ['A1','A2','A
鉴于以下 Python(从 http://norvig.com/sudoku.html)

def cross(A,B):
    "Cross product of elements in A and elements in B."
    return [a+b for a in A for b in B]

cols     = '123456789'
rows     = 'ABCDEFGHI'
squares  = cross(rows,cols)

这会产生:

['A1','A2','A3','A4','A5','A6','A7','A8','A9','B1','B2','B3',...]

作为练习,我想在C中做同样的事情.目前我有:

#include <iostream>
#include <map>
#include <vector>

using std::string;
using std::vector;

static vector<string> cross_string(const string &A,const string &B)
{
    vector<string> result;

    for (string::const_iterator itA = A.begin(); itA != A.end(); ++itA) {
        for (string::const_iterator itB = B.begin(); itB != B.end(); ++itB) {
            char s[] = {*itA,*itB,0};
            result.push_back(string(s));
        }
    }
    return result;
}

int main(int argc,char** argv)
{
    const char digits[] = "123456789";
    const char rows[]   = "ABCDEFGHI";

    vector<string> res = cross_string(rows,digits);

    for (vector<string>::const_iterator it = res.begin();
         it != res.end(); ++it) {
        std::cout << *it << std::endl;
    }
}

这有效,但我希望有更好的方法.这也只做字符串,而python做任何列表……

编辑:

感谢所有的回复.我接受了我最了解的那个,但Alf的答案紧随其后.我注意到所有使用C 11并且想知道作为C的新手是否应该直接采用它而不是学习旧标准.但这可能是另一个问题的最佳选择.

解决方法

奇怪的是,C算法库中缺少cross_product.它可以很容易地添加,但正如杰里和阿尔夫的答案所显示的那样,对如何做到最好的看法存在分歧.事实上,我仍然会做不同的事情. Jerry的界面符合其他C算法的界面,但他没有抽象出跨产品操作,我这样做了:

template <typename InputIt1,typename InputIt2,typename OutputIt,typename F>
void cross_product(InputIt1 begin1,InputIt1 end1,InputIt2 begin2,InputIt2 end2,OutputIt out,F f) {
    for (auto i = begin1; i != end1; ++i)
        for (auto j = begin2; j != end2; ++j)
            *out++ = f(*i,*j);
}

在您的示例中,调用将如下所示:

auto digits = "1234546789";
auto chars = "ABCDEFGHI";
vector<string> result;

cross_product(digits,digits + strlen(digits),chars,chars + strlen(chars),back_inserter(result),[](char a,char b) { return string() + a + b; });

(难道我不喜欢C 11吗?是的,我这样做.)

在一个合适的库中,我提供了第二个重载,它提供了一个默认的f操作,它创建了一个类似于Jerry代码所做的元组.甚至可以想到将其进一步抽象以允许两个以上的范围 – 毕竟,Python列表理解允许您迭代两个以上的范围).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读