2010-06-28 12 views
3

J'utilise actuellement le multi-index de Boost pour suivre le nombre de passages d'un paquet dans un système.Retour d'échec d'insertion multi-index (Boost)

Chaque fois qu'un système touche le paquet, son adresse IP est ajoutée à une chaîne, séparée par des virgules. Je passe ensuite par cette chaîne, la marque et ajoute chaque adresse IP trouvée dans un multi-index. Étant donné que les adresses IP sont définies comme uniques à l'heure actuelle, il est impossible d'ajouter la même adresse IP à l'index multiple. Que devrait arriver alors est la valeur associée à l'adresse IP devrait être incrémenté, en comptant combien de fois le paquet a traversé cette même adresse IP.

De toute façon, mon problème vient ici. Quand j'utilise quelque chose comme la carte stl, je reçois une réponse qui me permet de savoir qu'une clé n'a pas pu être ajoutée en raison d'une clé dupliquée déjà existante dans la carte. Est-ce que le multi-index de Boost offre quelque chose de similaire? Je sais que si j'essaie d'insérer le même IP il échouera, mais comment puis-je le dire a échoué?

est ici une partie de mon code actuel:

// Multi-index handling 
using boost::multi_index_container; 
using namespace boost::multi_index; 

struct pathlog 
{ 
    string   hop; 
    int  passedthru; 

    pathlog(std::string hop_,int passedthru_):hop(hop_),passedthru(passedthru_){} 

    friend std::ostream& operator<<(std::ostream& os,const pathlog& e) 
    { 
     os<<e.hop<<" "<<e.passedthru<<std::endl; 
     return os; 
    } 
}; 

// structs for data 
struct hop{}; 
struct passedthru{}; 

// multi-index container setup 
typedef multi_index_container< 
pathlog, 
indexed_by< 
ordered_unique< 
tag<hop>, BOOST_MULTI_INDEX_MEMBER(pathlog,std::string,hop)>, 
ordered_non_unique< 
tag<passedthru>, BOOST_MULTI_INDEX_MEMBER(pathlog,int,passedthru)> > 
> pathlog_set; 


int disassemblepathlog(const string& str, pathlog_set& routecontainer, const string& delimiters = ","){ 
    // Tokenizer (heavily modified) from http://oopweb.com/CPP/Documents/CPPHOWTO/Volume/C++Programming-HOWTO-7.html 

    // Skip delimiters at beginning. 
    string::size_type lastPos = str.find_first_not_of(delimiters, 0); 
    // Find first "non-delimiter". 
    string::size_type pos  = str.find_first_of(delimiters, lastPos); 

    while (string::npos != pos || string::npos != lastPos) 
    { 
     // Found a token, add it to the vector. 
     routecontainer.insert(pathlog((str.substr(lastPos, pos - lastPos)),1)); // if this fails, I need to increment the counter! 
     // Skip delimiters. Note the "not_of" 
     lastPos = str.find_first_not_of(delimiters, pos); 
     // Find next "non-delimiter" 
     pos = str.find_first_of(delimiters, lastPos); 
    } 
} 
+0

Je reconnais que je pouvais faire une recherche d'abord pour l'IP j'ajoute puis (si elle n'existe pas) ajouter. Je préfère juste garder les choses dans une opération la plus compacte, si possible. – BSchlinker

Répondre