C++STL の std::set にクラスインスタンスを利用した関数オブジェクトを渡し std::set のメモリ割当を回避する ― 2021年04月22日 11時58分16秒
すこし、複雑な比較演算子を使い始めると、クラスが大きくなってきたり、クラスのメンバ関数を周辺で呼び出したくなる。その様な用途では、value_comp は使いづらい。そこで、比較演算子用のクラスは外で定義しつつ、std::set に使わせる方法を模索していた。
前回と同じ greater を用いる。
今回は、greater は main 関数で定義し、std::bind を利用して std::set に割り当ている。
#include <set>
#include <functional>
#include <iostream>
struct greater
{
char gap[1024];
bool comp( int l, int r ) const { return l > r; }
};
int main()
{
greater g;
std::function< bool( int, int ) > fn = std::bind( &greater::comp, &g,
std::placeholders::_1, std::placeholders::_2 );
std::set< int, std::function< bool( int, int ) > > desc( fn );
std::cout << "desc sizeof " << sizeof( desc.value_comp() ) <&
lt; std::endl;
std::cout << "desc compare " << desc.value_comp()( 1, 2 ) <&l
t; std::endl;
}
これで、std::set 内のインスタンスを避けつつ、任意の比較演算子を渡すことが出来た。
% c++ value_comp3.cpp
% ./a.out
desc sizeof 24
desc compare 0
前回。
最近のコメント