如何打印属于地图的一系列元素(std::p air<size_t,std::string>)(不是所有元素)

How to print a range of elements (std::pair<size_t, std::string>) belonging to a map (not all elements)

本文关键字:std 元素 size string gt 属于 打印 何打印 地图 air 一系列      更新时间:2023-10-16

如何打印属于 std::map<size_t, std::string>?
的一系列元素(键和值(我不需要打印所有元素。
使用C 11,C 14或C 17的每个建议,都不是boost库。

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
using namespace std;
void print(map<size_t, string> & m)
{
    for(auto & [key, value] : m)
    {
        cout << setw(6) << left << key << value << endl;
    }
}
void print_range(map<size_t, string> & m, size_t first, size_t last)
{
    // ???
}
int main()
{
    map<size_t, string> data {
                                { 5, "guitar" },
                                { 8, "saxophone" },
                                { 28, "trumpet" },
                                { 32, "trombone" },
                                { 42, "violin" },
                                { 45, "viola" },
                                { 48, "cello" },
                                { 52, "double bass" },
                                { 100, "piano" },
                                { 104, "drum" }
                             };
    print(data);
    print_range(data, 42, 52);    // ???
    return 0;
}

预期输出为:

42  violin
45  viola
48  cello
52  double bass

使用std::map::lower_bound()std::map::upper_bound()

auto p = make_pair(data.lower_bound(42), data.upper_bound(52));
for (auto [begin, end] = p; begin != end; begin++) {
  std::cout << begin->first << " " << begin->second << 'n';
}

我不明白……为什么不直接比较?

void print_range(map<size_t, string> & m, size_t first, size_t last)
{
    for(auto & kvp : m)
    {
        if (kvp.first >= first && kvp.first <= last)
            cout << setw(6) << kvp.first << ":" << kvp.second << endl;
    }
}

我尝试了...毫无问题。

std::for_each非常适合:

void print_range(map<size_t, string> & m, size_t first, size_t last)
{
    auto from = m.lower_bound (first);
    auto to = m.upper_bound (last);
    std::for_each (from, to, [] (const auto &e)
        { std::cout << e.first << ' ' << e.second << 'n'; });
}

实时演示