Bonjour � tous,
Avant de cr�er le sujet, j'ai pu faire des recherches via les documentations officielles, les forums (connus) mais malheureusement, je n'ai pas ou tr�s pu eu de r�ponse.
Contexte :
J'essaye de concevoir un cache pour stocker certaines donn�es li�es � des param�tres qui sont tr�s souvent demand�es. Le but est d'�viter de toujours rechercher la m�me chose sachant que juste avant j'ai d� sortir les m�mes donn�es en r�ponse.
L'id�e a �t� de d�velopper un cache LRU. J�utiliserais ce cache � divers endroits de mon code dans diff�rentes fonctions de diff�rentes classes ; le but est d�attraper les valeurs entrantes et sortantes de certaines fonctions pour les stocker dans mon cache.
Donc il y a aussi un souci que mon cache ne doit pas �tre cr�� et d�truit � chaque processus, cela perdrait de son sens.
�pres avoir fait un prototype en c++ sans librairie (pour ne pas se perdre dans plein de documents, je ne posterais pas ce code-ci, car ce n'est pas le sujet principal de mon poste.), je me suis int�ress� � la libraire Boost pour trouver des ajouts et optimiser certains cas. Id�e tr�s plaisante, car j'ai pu trouver dans la documentation un point hyper int�ressant � utiliser :
https://www.boost.org/doc/libs/1_34_....html#example9 .
Suite � cela, j'ai recherch� � droite � gauche et trouver un exemple qui me paraissait assez simple et possible � utiliser.
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 102
| #include <boost/multi_index_container.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/key.hpp>
template<typename Tkey, typename Tval>
class CacheWeb{
private:
using value_type = std::pair<Tkey, Tval>;
unsigned int capacity;
boost::multi_index_container<
value_type,
boost::multi_index::indexed_by<
boost::multi_index::sequenced<>,
boost::multi_index::hashed_unique<boost::multi_index::key<&value_type::first>>
>
> container;
CacheWeb(const CacheWeb&) = delete;
CacheWeb& operator=(const CacheWeb&) = delete;
int capacityOut(){
if( capacity == 0 || container.size() < capacity ) {
return 0;
}
int cnt = 0;
while(container.size() > capacity) {
container.pop_back();
++cnt;
}
return cnt;
};
public:
CacheWeb(int icapacity) : capacity(icapacity){};
virtual ~CacheWeb() = default;
int size(){
return container.size();
};
bool empty(){
return container.empty();
};
void clear(){
container.clear();
};
bool contains(const Tkey& key){
const auto& lookup = container.template get<1>();
return lookup.find(key) != container.template get<1>().end();
};
void remove(const Tkey& key){
container.erase(key);
};
void put(const Tkey& key, const Tval& val){
auto& lookup = container.template get<1>();
auto it = lookup.find(key);
if( it != lookup.end() ) {
lookup.modify(it,[&](value_type& x){ x.second = val; });
}
else{
it=lookup.emplace(key, val).first;
}
container.relocate(container.begin(),container.template project<0>(it));
capacityOut();
};
std::list<std::pair<Tkey, Tval>>getItems(){
return {container.begin(), container.end()};
};
const Tval& get(const Tkey& key){
const auto& lookup = container.template get<1>();
const auto it = lookup.find(key);
if( it == lookup.end() ) {
throw std::invalid_argument("Key does not exist");
}
return it->second;
}
};
#include <iostream>
int main()
{
CacheWeb<int,int> c(10);
for(int i=0;i<11;++i)c.put(i,i);
for(const auto& x:c.getItems()){
std::cout<<"("<<x.first<<","<<x.second<<")";
}
std::cout<<"\n";
for(int i=1;i<11;++i){
std::cout<<i<<"->"<<c.get(i)<<" ";
}
std::cout<<"\n";
} |
Malheureusement, plusieurs questions me viennent � l�esprit et aussi quelques probl�matiques :
1- A cette ligne-l� :
boost::multi_index_container<value_type,boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::hashed_unique<boost::multi_index::key<&value_type::first>>>> container;
Je ne comprends pas trop le concept derri�re ceci ? J�ai un container avec deux param�tres, ok, mais on souhaite cr�er quoi en fait comme container ? D�apr�s les recherche, c�est un type vector...
2 � Par rapport � la ligne de code pr�c�dente, donc celle-ci :
boost::multi_index_container<value_type,boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::hashed_unique<boost::multi_index::key<&value_type::first>>>> container;
J�ai export� le code et builder un peu pour mieux comprendre ce qu�il faisait, mais j�obtiens quelques erreurs :
2.1: Too few template arguments for class template 'sequenced'clang(template_arg_list_different_arity)
2.2: No member named 'key' in namespace 'boost::multi_index'clang(no_member)
J�ai essay� de r�gler le probl�me en modifiant le container
boost::multi_index::key<&value_type::first>
Par ceci :
boost::multi_index::member<value_type,Tkey,&value_type::first>
Malheureusement, j�obtiens cette erreur : error: template argument 2 is invalid
3 � Derni�re question, je comprends mal certains fonctions li�e a boost :
3.1 template get<1>();
3.2 emplace
J�ai trifouill� dans la documents boost, mais soit j�ai louper la page ou je ne sais pas.
Voil�, je vous remercie de lire mon poste ! Je souhaite bien sur avancer dans ce projet et mes connaissances, et je suis arriv� au moment ou je viens � la recherche d�aide.
Je vous souhaite une bonne journ�e ou soir�e.
Partager