您的位置:

如何使用map获取所有的value

一、获取map中所有的value


// 使用循环遍历获取所有value
std::map
    my_map = {{1, "Hello"}, {2, "World"}};
std::vector
     values;
for (auto& pair : my_map) {
    values.push_back(pair.second);
}

    
   

使用循环遍历的方法可以获取map中所有的value,将pair.second插入到vector中即可。这种方法可以实现简单易懂,但是效率不高,需要循环遍历整个map。

二、使用transform函数获取所有的value


// 使用transform函数获取所有value
std::map
    my_map = {{1, "Hello"}, {2, "World"}};
std::vector
     values(my_map.size());
std::transform(my_map.begin(), my_map.end(), values.begin(),
    [](const auto& pair){ return pair.second; });

    
   

使用transform函数可以更加简洁高效地获取map中所有的value,而无需手动遍历,提高了代码的可读性和性能。

三、使用boost库的transform_values函数获取所有的value


#include 
   
// 使用boost库的transform_values函数获取value
std::map
     my_map = {{1, "Hello"}, {2, "World"}};
std::vector
      values = my_map | boost::adaptors::map_values;

     
    
   

使用boost库的transform_values函数可以更加简洁地获取map中所有的value,同时还能提高运行效率。

四、使用C++20中的std::ranges::views::values获取所有的value


#include 
   
// 使用C++20中的std::ranges::views::values获取value
std::map
     my_map = {{1, "Hello"}, {2, "World"}};
std::vector
      values = my_map | std::ranges::views::values;

     
    
   

C++20中新增的std::ranges::views::values函数也可以方便获取所有的value,并且运行效率更高。需要注意的是,此函数需要使用包含ranges头文件的编译器。

五、使用boost库的indirect_iterator获取value


#include 
   
// 使用boost库的indirect_iterator获取所有value
std::map
    > my_map = {{1, std::make_unique
     ("Hello")},
                                                      {2, std::make_unique
      ("World")}};
std::vector
       
        values; std::transform(boost::make_indirect_iterator(my_map.begin()), boost::make_indirect_iterator(my_map.end()), std::back_inserter(values), [](const auto& str_ptr){ return *str_ptr; });
       
      
     
    
   

如果map的value是指针类型,可以使用boost库的indirect_iterator获取所有value,并且将结果存储到vector容器中。在使用过程中,需要注意释放内存。