簡體   English   中英

有沒有辦法遍歷 std::map 的第二個元素?

[英]Is there a way to iterate over the second element of a std::map?

我想創建一個std::vector<char>類似於: v(map.begin(), map.end()); 而不是遍歷 map 的所有元素並一遍又一遍地調整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);
        }
}

在 C++20 中,您可以使用轉換視圖:

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

演示

如評論中所述,您可以為向量reserve空間以避免重新分配。 使用 C++ 的 for 循環現在用於破壞諸如地圖之類的東西的工具,這非常干凈。

#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;
    
    v.reserve(map.size());
 
    for (auto& [i, c] : map) v.push_back(c);
    for (auto& i : v) std::cout << i << std::endl;
}

您可以在std::vector上調用reserve以分配您需要的 memory 並避免調整大小。

#include <map>
#include <vector>
#include <algorithm>

int main( )
{
    std::map<int, char> map{{1,'a'},{2,'b'},{3,'c'}, {4,'d'}};
    std::vector<char> v{ };
    v.reserve( map.size( ) );

    std::for_each( std::begin( map ), std::end( map ), 
        [ &v ]( const auto& pair ){ v.push_back( pair.second ); } );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM