我目前正在将Python中的算法转换为C ++。
这一行EXCH_SYMBOL_SETS = [["i", "1", "l"], ["s", "5"], ["b", "8"], ["m", "n"]]
现在是
vector<vector<char>> exch_symbols;
vector<char> vector_1il;
vector_1il.push_back('1');
vector_1il.push_back('i');
vector_1il.push_back('l');
vector<char> vector_5s;
vector_5s.push_back('5');
vector_5s.push_back('s');
vector<char> vector_8b;
vector_8b.push_back('8');
vector_8b.push_back('b');
vector<char> vector_mn;
vector_mn.push_back('m');
vector_mn.push_back('n');
exch_symbols.push_back(vector_1il);
exch_symbols.push_back(vector_5s);
exch_symbols.push_back(vector_8b);
exch_symbols.push_back(vector_mn);
我讨厌在二维矢量中为每个内部变量设置一个中间命名变量。我对C ++中的多维数据结构并不熟悉。还有更好的方法吗?
之后发生的事情是:
multimap<char, char> exch_symbol_map;
/*# Insert all possibilities
for symbol_set in EXCH_SYMBOL_SETS:
for symbol in symbol_set:
for symbol2 in symbol_set:
if symbol != symbol2:
exch_symbol_map[symbol].add(symbol2)*/
void insert_all_exch_pairs(const vector<vector<char>>& exch_symbols) {
for (vector<vector<char>>::const_iterator symsets_it = exch_symbols.begin();
symsets_it != exch_symbols.end(); ++symsets_it) {
for (vector<char>::const_iterator sym1_it = symsets_it->begin();
sym1_it != symsets_it->end(); ++sym1_it) {
for (vector<char>::const_iterator sym2_it = symsets_it->begin();
sym2_it != symsets_it->end(); ++sym2_it) {
if (sym1_it != sym2_it) {
exch_symbol_map.insert(pair<char, char>(*sym1_it, *sym2_it));
}
}
}
}
}
所以这个算法应该以这种或那种方式工作,这里有表示。目标是稍后可以轻松更改EXCH_SYMBOL_SETS
以包含新的char
组或向现有组添加新字母。谢谢!
答案 0 :(得分:2)
我会重构,而不是vector<char>
,使用std::string
作为内部,即。
vector<string> exch_symbols;
exch_symbols.push_back("1il");
exch_symbols.push_back("s5");
exch_symbols.push_back("b8");
exch_symbols.push_back("mn");
然后更改插入方法:
void insert_all_exch_pairs(const vector<string>& exch_symbols)
{
for (vector<string>::const_iterator symsets_it = exch_symbols.begin(); symsets_it != exch_symbols.end(); ++symsets_it)
{
for (string::const_iterator sym1_it = symsets_it->begin(); sym1_it != symsets_it->end(); ++sym1_it)
{
for (string::const_iterator sym2_it = symsets_it->begin(); sym2_it != symsets_it->end(); ++sym2_it)
{
if (sym1_it != sym2_it)
exch_symbol_map.insert(pair<char, char>(*sym1_it, *sym2_it));
}
}
}
}
答案 1 :(得分:1)
您可以通过删除中间值来缩短它
vector<vector<char> > exch_symbols(4, vector<char>()); //>> is not valid in C++98 btw.
//exch_symbols[0].reserve(3)
exch_symbols[0].push_back('i');
etc.
您也可以使用boost.assign或类似的东西
EXCH_SYMBOL_SETS = [["i", "1", "l"], ["s", "5"], ["b", "8"], ["m", "n"]]
然后成为
vector<vector<char>> exch_symbols(list_of(vector<char>(list_of('i')('1')('l')))(vector<char>(list_of('s')('5'))(list_of('m')('n')))
(未经过测试,从未在嵌套向量中使用它,但它应该是这样的)
答案 2 :(得分:1)
您的代码:
vector<char> vector_1il;
vector_1il.push_back('1');
vector_1il.push_back('i');
vector_1il.push_back('l');
简明代码:
char values[] = "1il";
vector<char> vector_1il(&values[0], &values[3]);
你没事吗?
如果您想按照Nim的建议使用std::string
,那么您甚至可以使用此功能:
//Concise form of what Nim suggested!
std::string s[] = {"1il", "5s", "8b", "mn"};
vector<std::string> exch_symbols(&s[0], &s[4]);
休息,您可以关注Nim's post。 : - )
答案 3 :(得分:1)
关于你的真正问题......
我怎么能翻译L = [A,[B], [[C],D]]]到C ++ ......完全没有!
没有直接翻译 - 您已从存储相同类型的值切换到存储变量类型的值。 Python允许这样做,因为它是一种动态类型语言,而不是因为它具有更好的数组语法。
有很多方法可以在C ++中复制行为(例如,boost :: any或boost :: variant的向量,或者支持这种行为的用户定义的容器类),但它永远不会像它一样简单。在Python中。
答案 4 :(得分:1)
在c ++ 0x中指令
vector<string> EXCH_SYMBOL_SETS={"i1l", "s5", "b8", "mn"} ;
编译并正常工作。可悲的是,显然是相似的陈述
vector<vector<char>> EXCH_SYMBOL_SETS={{'i','1','l'},{'s','5'}, {'b','8'}, {'m','n'}};
不起作用:-(。
这是在g ++ 4.5.0或更高版本中实现的,您应该添加-std=c++0x
选项。我认为这个功能在microsoft c(VC10)中尚不可用,我不知道其他编译器的状态是什么。
答案 5 :(得分:0)
我知道这是一篇旧帖子,但如果有人偶然发现它,parents()
已经大大更好地处理这些内容:
在 cy.contains('div.title', 'title1')
.parents('div.styledCard')
.contains('div.subtitle', 'subtitle1')
中,第一个代码块可以简单地重写为:
C++
这对 c++11
也没什么特别的,我们可以像这样嵌套 std::vector<std::string> exch_symbols {"1il", "5s", "8b", "mn"};
:
string
这里是 vector
样式的完整代码,最后添加了 std::vector<std::vector<int>> vov {{1,2,3}, {2,3,5,7,11}};
:
c++14