File: segment_tree.cpp

package info (click to toggle)
mdds 3.2.0-4
  • links: PTS
  • area: main
  • in suites: experimental
  • size: 6,372 kB
  • sloc: cpp: 21,777; sh: 1,369; makefile: 692; python: 602
file content (101 lines) | stat: -rw-r--r-- 2,451 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */

// SPDX-FileCopyrightText: 2020 - 2025 Kohei Yoshida
//
// SPDX-License-Identifier: MIT

//!code-start: header
#include <mdds/segment_tree.hpp>
#include <string>
#include <iostream>
//!code-end: header

//!code-start: type
using tree_type = mdds::segment_tree<long, std::string>;
//!code-end: type

//!code-start: search-and-print
void search_and_print(const tree_type& tree, long pos)
{
    auto results = tree.search(pos);

    std::cout << "--" << std::endl;
    std::cout << "search at " << pos << std::endl;
    std::cout << "number of results: " << results.size() << std::endl;

    for (const auto& [start, end, value] : results)
        std::cout << "range: [" << start << ":" << end << "); value: " << value << std::endl;
}
//!code-end: search-and-print

void erase_by_iterator(tree_type tree)
{
    //!code-start: erase-by-iterator
    auto results = tree.search(5);
    for (auto it = results.begin(); it != results.end(); ++it)
    {
        if (it->value == "A")
        {
            tree.erase(it);
            break;
        }
    }
    //!code-end: erase-by-iterator

    //!code-start: search-5-after-erase-by-iterator
    search_and_print(tree, 5);
    //!code-end: search-5-after-erase-by-iterator
}

void erase_by_predicate(tree_type tree)
{
    //!code-start: erase-by-predicate
    auto pred = [](long start, long end, const std::string& /*value*/)
    {
        return start <= 5 && 5 < end;
    };

    auto n = tree.erase_if(pred);

    std::cout << "--" << std::endl;
    std::cout << n << " segments have been removed" << std::endl;
    //!code-end: erase-by-predicate

    //!code-start: search-5-after-erase-by-predicate
    search_and_print(tree, 5);
    //!code-end: search-5-after-erase-by-predicate
}

int main() try
{
    //!code-start: insert
    tree_type tree;

    tree.insert(0, 10, "A");
    tree.insert(2, 15, "B");
    tree.insert(-2, 5, "C");
    tree.insert(5, 22, "D");
    tree.insert(20, 35, "E");
    //!code-end: insert

    //!code-start: build
    tree.build_tree();
    //!code-end: build

    //!code-start: search-5
    search_and_print(tree, 5);
    //!code-end: search-5

    //!code-start: search-0
    search_and_print(tree, 0);
    //!code-end: search-0

    erase_by_iterator(tree);
    erase_by_predicate(tree);
}
catch (...)
{
    return EXIT_FAILURE;
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */