How do I get a const_iterator using auto?

前端 未结 8 1777
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-13 08:18

First question: is it possible to \"force\" a const_iterator using auto? For example:

map usa         


        
相关标签:
8条回答
  • 2020-12-13 08:44

    Since C++17 you can use std::as_const like this:

    #include <utility>
    
    // ...
    
    auto city_it = std::as_const(usa).find("New York");
    
    0 讨论(0)
  • 2020-12-13 08:47

    Another variation using auto (keeping both a mutable usa and a const usa):

    map<std::string, int> usa;
    //...init usa
    const auto &const_usa = usa;
    auto city_it = const_usa.find("New York");
    

    If you don't need the map to be mutable at all after init there are some other options.

    you can define usa as const and init it with a function call:

    const map<std::string, int> usa = init_usa();
    auto city_it = usa.find("New York");
    

    or using a lambda to init a const map:

    const auto usa = [&]()->const map<std::string, int> 
       {
       map<std::string, int> usa;
       //...init usa
       return usa;
       }();
    auto city_it = usa.find("New York");
    
    0 讨论(0)
  • 2020-12-13 08:50

    I'm not in a position to test this right now, but I think it'll do the trick:

    auto city_it = const_cast< const map<int> & >(usa).find("New York");
    
    0 讨论(0)
  • 2020-12-13 09:05

    Sorry, but I just think the best suggestion is not using auto at all, since you want to perform a (implicitly valid) type conversion. auto is meant for deducing the exact type, which is not what you want here.

    Just write it this way:

    std::map<std::string, int>::const_iterator city_it = usa.find("New York");
    

    As correctly pointed out by MooingDuck, using type aliases can improve the readability and maintainability of your code:

    typedef std::map<std::string, int> my_map;
    my_map::const_iterator city_it = usa.find("New York");
    
    0 讨论(0)
  • 2020-12-13 09:06

    You can use auto to "track" a type or "deduce" a type: // deduce auto city_it = usa.find("New York");

    // track auto city_it = std::map<int>::const_iterator( usa.find("New York"));

    Also, watch is modern c++ style talks by Herb Sutter, which covers most of these type deductions guidance. https://youtu.be/xnqTKD8uD64

    0 讨论(0)
  • 2020-12-13 09:07

    A clean solution is to work with a const reference to the otherwise modifiable map:

    const auto &const_usa = usa;
    auto city_it = const_usa.find("New York");
    

    This will make sure you can't modify const_usa, and will use const iterators.

    0 讨论(0)
提交回复
热议问题