C++ equivalent of Python dictionaries

后端 未结 5 790
后悔当初
后悔当初 2021-02-14 06:42

I\'m currently making a tic-tac-toe program with AI and i\'m having a bit of a trouble translating this line of code (python) :

RANKS = dict([(4,3),                      


        
相关标签:
5条回答
  • 2021-02-14 06:49

    The closest match in C++ would be an std::unordered_map<int, int>. This is a hash table mapping int keys to int values.

    #include <unordered_map>
    
    
    std::unordered_map<int, int> RANKS = {
            { 4, 3 },
            { 0, 2 }, { 2, 2 }, { 6, 2 }, { 8, 2 },
            { 1, 1 }, { 3, 1 }, { 5, 1 }, { 7, 1 }
    };
    

    You can access elements using operator[], for example

    std::cout << RANKS[0] << std::endl; // prints "2"
    

    Note that the C++ standard library also has the std::map class template, which allows you to create a similar but ordered look-up table std::map<int, int>, with logarithmic look-up and insertion complexity. But python dicts are hash tables, so unordered_map is a closer match in terms of behaviour.

    0 讨论(0)
  • 2021-02-14 06:51

    You could use a map or unordered_map for this (and they'd work fine) but given that your keys are a dense set of integers (I.e. all the integers from 0 to N) there are better choices.

    I'd probably use an std::array instead. It would look something like this:

    std::array <char, 9> vals = { 2, 1, 2, 1, 3, 1, 2, 1, 2 };
    

    This gives pretty much the same syntax and observable behavior, but will typically save quite a bit of memory and probably CPU time as well.

    0 讨论(0)
  • The C++ equivalent of Python's dict is std::map. To initialize a map using a similar syntax, do this:

    std::map<int,int> myMap = {{4,3},                       # center  = 3
                               {0,2},{2,2},{6,2},{8,2},     # corners = 2
                               {1,1},{3,1},{5,1},{7,1}};    # sides   = 1
    

    Note that this needs C++11.

    If you cannot use C++11, turn to map_list_of in Boost.Assign. The example from their page is:

    using namespace boost::assign; // bring 'map_list_of()' into scope
    std::map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
    
    0 讨论(0)
  • 2021-02-14 07:08

    In C++ this would be a std::unordered_map

    #include <unordered_map>
    
    std::unordered_map<int, int> dict
    {
        {
            { 4, 3 },
            { 0, 2 }, { 2, 2 }, { 6, 2 }, { 8, 2 },
            { 1, 1 }, { 3, 1 }, { 5, 1 }, { 7, 1 }
        }
    };
    
    0 讨论(0)
  • 2021-02-14 07:13

    Although a "language equivalent" might me something like an std::unordered_map your use case may be more efficiently served with a straight array:

    int RANKS[] = {2, 1, 2, 1, 3, 1, 2, 1, 2};
    
    0 讨论(0)
提交回复
热议问题