C++ Boost Adapters

Da Andreabont's Wiki.

La libreria BOOST fornisce degli adattatori per gli iteratori che permettono un accesso più comodo alle strutture dati. Altri strumenti simili possono essere trovati nella pagina C++ Boost Range

Reverse

Questo adattatore permette di accedere comodamente agli iteratori inversi:

#include <iostream>
#include <vector>
#include <boost/range/adaptor/reversed.hpp>

int main () {
    
    std::vector<int> vector = {1,2,3,4,5,6,7,8,9};
    
    for(auto &i : boost::adaptors::reverse(vector)) {
        std::cout << i << " ";
    }
    
    std::cout << std::endl;
    
}

Stampa:

9 8 7 6 5 4 3 2 1

Filter

Questo adattatore permette di filtrare i dati contenuti in una struttura dati:

#include <iostream>
#include <vector>
#include <boost/range/adaptor/filtered.hpp>

int main () {
    
    std::vector<int> vector = {1,2,3,4,5,6,7,8,9};
    
    for(auto &i : boost::adaptors::filter(vector, [](int x){ return x % 2 == 0; })) {
        std::cout << i << " ";
    }
    
    std::cout << std::endl;
    
}

Stampa:

2 4 6 8

Slice

Questo adattatore permette di iterare solo su una porzione indicata:

#include <iostream>
#include <vector>
#include <boost/range/adaptor/sliced.hpp>

int main () {
    
    std::vector<int> vector = {1,2,3,4,5,6,7,8,9};
    
    for(auto &i : boost::adaptors::slice(vector, 4, 8)) {
        std::cout << i << " ";
    }

    std::cout << std::endl;
    
}

Stampa:

5 6 7 8

Stride

Questo adattatore permette di iterare con un passo indicato:

#include <iostream>
#include <vector>
#include <boost/range/adaptor/strided.hpp>

int main () {
    
    std::vector<int> vector = {1,2,3,4,5,6,7,8,9};
    
    for(auto &i : boost::adaptors::stride(vector, 3)) {
        std::cout << i << " ";
    }
    
    std::cout << std::endl;
    
}

Stampa:

1 4 7

Unique

Questo adattatore permette di iterare ignorando i duplicati:

#include <iostream>
#include <vector>
#include <boost/range/adaptor/uniqued.hpp>

int main () {
    
    std::vector<int> vector = {1,1,2,2,3,3,4,4,5,5};
    
    for(auto &i : boost::adaptors::unique(vector)) {
        std::cout << i << " ";
    }
    
    std::cout << std::endl;
    
}

Stampa:

1 2 3 4 5

Transform

Questo adattatore permette di iterare applicando prima una funzione sui dati:

#include <iostream>
#include <vector>
#include <boost/range/adaptor/transformed.hpp>

int main () {
    
    std::vector<int> vector = {1,2,3,4,5,6,7,8,9};
    
    for(auto i : boost::adaptors::transform(vector, [](int x){ return x + 1; })) {
        std::cout << i << " ";
    }
    
    std::cout << std::endl;
    
}

Stampa:

2 3 4 5 6 7 8 9 10

Indirect

Questo adattatore permette accedere al valore indicato dai puntatori inseriti nella struttura dati:

#include <iostream>
#include <vector>
#include <boost/range/adaptor/indirected.hpp>

int main () {
    
    std::vector<int*> vector = {
        new int(1),
        new int(2),
        new int(3)
    };
    
    for(auto &i :  boost::adaptors::indirect(vector)) {
        std::cout << i << " ";
    }
    
    std::cout << std::endl;
    
}

Stampa:

1 2 3

Map

Questo due adattatori lavorano su std::map e permettono di iterare rispettivamente sulle chiavi e sui valori della mappa:

#include <iostream>
#include <map>
#include <boost/range/adaptor/map.hpp>

int main () {
    
    std::map<int, char> map = {
        {1, 'a'},
        {2, 'b'},
        {3, 'c'}
    };
    
    for(auto &i :  boost::adaptors::keys(map)) {
        std::cout << i << " ";
    }

    std::cout << std::endl;

    for(auto &i :  boost::adaptors::values(map)) {
        std::cout << i << " ";
    }
    
    std::cout << std::endl;
    
}

Stampa:

1 2 3 
a b c