C ++中的简明列表/向量

时间:2011-01-05 11:02:50

标签: c++ python stl vector

我目前正在将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组或向现有组添加新字母。谢谢!

6 个答案:

答案 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