以下是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++新手,我是否应该直接采用它,而不是学习旧标准。但这可能最好另外提问。