Short Lists / Vectors in C ++

I am currently translating an algorithm in Python in C ++.

This line is EXCH_SYMBOL_SETS = [["i", "1", "l"], ["s", "5"], ["b", "8"], ["m", "n"]] now

    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);

I don't like having an intermediate named variable for every internal variable in a two-dimensional vector. I am not very familiar with multidimensional data structures in C ++. Is there a better way?

What happens after that:

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));
                            }
                    }
            }
    }
}

So, this algorithm should somehow work with the view here. The goal is that EXCH_SYMBOL_SETSyou can easily change later to include new groups charor add new letters to existing groups. Thank!

+3
source share
5 answers

I would instead vector<char>use refactoring std::stringas internal, i.e.

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));
      }
    }
  }
}
+2

,

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'))) ( , )

+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]);

?


std::string, Nim, :

//Concise form of what Nim suggested!
std::string s[] = {"1il", "5s", "8b", "mn"};
vector<std::string> exch_symbols(&s[0], &s[4]);

, .: -)

+1

...

L = [A, [B], [[C], D]]] ++... !

- . Python , , , .

++ (, boost:: any boost:: variant , ), , Python.

+1

++ 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), , .

+1

Source: https://habr.com/ru/post/1783603/


All Articles