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.
Code:
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à :
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...Code: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;
2 – Par rapport à la ligne de code précédente, donc celle-ci :
J’ai exporté le code et builder un peu pour mieux comprendre ce qu’il faisait, mais j’obtiens quelques erreurs :Code: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;
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
Par ceci :Code:boost::multi_index::key<&value_type::first>
Code: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.