खैर, सदस्य समारोह indexers के लिए दस्तावेज़ कहते हैं कि वे संदर्भित सदस्य फ़ंक्शन को कॉल करें: http://www.boost.org/doc/libs/1_46_0/libs/multi_index/doc/reference/key_extraction.html#key_extractors
लेकिन संदेह में जब, प्रोफाइल:
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/indexed_by.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
namespace bmi = boost::multi_index;
int g_calls = 0;
struct A
{
explicit A(int sz) : m_size(sz) { }
int size() const { ++g_calls; return m_size; }
private:
int m_size;
};
typedef boost::multi_index_container<
A*,
bmi::indexed_by<
bmi::ordered_non_unique<
BOOST_MULTI_INDEX_CONST_MEM_FUN(A,int,A::size)
>
>
> container_t;
int main()
{
container_t cont;
int n = 100;
vector<int> o(2*n+1);
for(int i = 0; i != 2*n+1; ++i)
o[i] = i;
random_shuffle(o.begin(), o.end());
for(int i = 0; i != n; ++i)
cont.insert(new A(o[i]));
cout << "Calls to A::size(): "<< g_calls << endl;
for(int i = n+1; i <= 2*n; ++i)
cont.insert(new A(o[i]));
cout << "Calls to A::size(): "<< g_calls << endl;
cont.insert(new A(o[n]));
cout << "Calls to A::size(): "<< g_calls << endl;
for(int i = 0; i != o.size(); ++i)
cont.find(o[i]);
cout << "Calls after calling find " << o.size() << " times: "<< g_calls << endl;
return 0;
}
निम्नलिखित निर्गम (बूस्ट 1.46 का प्रयोग करके) देता है:
Calls to A::size(): 629
Calls to A::size(): 1465
Calls to A::size(): 1474
Calls after calling find 201 times: 3262
इसलिए, यह जवाब प्रकट होता है नहीं, यह कैश को महत्व देता नहीं करता है।
बहुत बढ़िया, धन्यवाद। यह बहुत बुरा है। मुझे लगता है कि मुझे अपना प्रकार लपेटना होगा। – vsekhar