有没有办法迭代 std::map 的第二个元素?

nac*_*001 2 c++

我想创建一个std::vector<char>类似的东西: v(map.begin(), map.end());而不是迭代地图的所有元素并v一遍又一遍地调整大小。

#include<iostream>
#include<map>
#include<vector>

int main() {
        std::map<int, char> map{{1,'a'},{2,'b'},{3,'c'}, {4,'d'}};
        std::vector<char> v;
        for(auto& [ i , c ] : map){
            // std::cout << i << " -> " << c <<"\n";
            v.push_back(c);
        }
}
Run Code Online (Sandbox Code Playgroud)

Ted*_*gmo 7

在 C++20 中,您可以使用以下命令创建值的视图std::views::values

#include <map>
#include <vector>
#include <ranges>

int main() {
    std::map<int, char> map{{1, 'a'}, {2, 'b'}, {3, 'c'}, {4, 'd'}};    
    auto view = std::views::values(map);
    std::vector<char> v(view.begin(), view.end());
}
Run Code Online (Sandbox Code Playgroud)

演示

更通用的视图是std::views::transform您提供通过函子完成的转换的位置:

#include <map>
#include <vector>
#include <ranges>

int main() {
    std::map<int, char> map{{1, 'a'}, {2, 'b'}, {3, 'c'}, {4, 'd'}};    
    auto view = map | std::views::transform([](auto&& p){ return p.second; });
    std::vector<char> v(view.begin(), view.end());
}
Run Code Online (Sandbox Code Playgroud)

演示

  • 天哪,我希望我能在工作中使用“C++20”...... (2认同)
  • `std::views::values` 会更干净。 (2认同)