Librairie Boost Assign pour initialiser rapidement un containeur

Boost contient de nombreuses librairies qui sont d’une grande utilité et parmi une de celles-ci la librairie boost  assign. Brièvement, cette librairie contient un ensemble d’utilitaires qui permet d’initialiser des containeurs de la STL. Dans mes taches courantes de tous les jours de programmeurs, j’ai souvent besoin de prototyper rapidement, par exemple tester le comportement d’un algorithme, on veut initialiser rapidement un containeur. Ci-dessous je présente une série de petits exemples d’applications qui permettent d’être  en opérationnel avec cette librairie.

Pour utiliser cette librairie on a besoin d’inclure les fichiers suivants :

// boost assign library
#include <boost/assign.hpp>                      
#include <boost/assign/list_of.hpp>
#include <boost/assign/ptr_list_of.hpp>
#include <boost/assign/ptr_list_inserter.hpp>   // for 'ptr_push_back()', 'ptr_insert()' and 'ptr_push_front()'
#include <boost/assign/std/vector.hpp>          // for 'operator+=()'

 Initialiser un vecteur

Pour initialiser un vector on utilise l’operateur  « += » qui permet de donner des valeurs initiale sous forme d’une liste (similaire a C++11 list initialiser).

// Boost Assign library
std::vector w_vec;
w_vec += 1,2,3,4,5,6,7,8,9; // operator += list initialization

on peut egalement utilizer un utilitaire

// assign library
std::vector w_value = list_of(1)(2)(3)(4)(5);  // initialize the vector

Il est possible d’initialiser un vector de pointer egalement, dans cet exemple j’utilise the «bind adaptor» de C++11 pour de-allocation de la mémoire. Je vais revenir dans un autre blog sur ce nopuvel adaptor.

Vecteur de pointer

// Create a vector of pointer
std::vector<int*> w_vecptrInt; 
w_vecptrInt = list_of<int*>( new int(1))( new int (2))( new int(6))( new int(3));
assert( w_vecptrInt.size()==4);
auto w_first = w_vecptrInt.back();
std::cout << "The type of the pointer is " << typeid(w_first).name() << "\n";
std::cout << "The value of the first element is " << *w_first << "\n";
if (!w_vecptrInt.empty())
{
// delete each element of the container in a simple manner
std::for_each( std::begin(w_vecptrInt),std::end(w_vecptrInt), 
	std::bind(::operator delete, _1));
}

Boost container de pointer

Les container de pointer de la librairie boost peuvent etre egalement initialiser avec « ptr_list_of »

boost::ptr_vector w_testPtrListOf = ptr_list_of(1)(2)(6)(3);

Initialiser un vecteur de pair

// create a pair vector for testing
std::vector w_vofpair=pair_list_of(1,2)(2,3)(21,5)(3,6);
std::list w_keyList;
// way to print the key of the pair element very efficiently
for( auto& first : w_vofpair | map_keys) // range loop
{
  // copy to range
  w_keyList.push_back(first);
}
assert( w_keyList.size() == w_vofpair.size());

 

0 réponses

Laisser un commentaire

Rejoindre la discussion?
N'hésitez pas à contribuer !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.