C++STL の std::set にクラスインスタンスを利用した関数オブジェクトを渡し std::set のメモリ割当を回避する2021年04月22日 11時58分16秒

C++ コンテナに大きなオブジェクトを渡し std::set の大きさに追加されるのを確認し、関数オブジェクトが std::set へのメモリ割当てを回避するのに利用できるのを確認した。

すこし、複雑な比較演算子を使い始めると、クラスが大きくなってきたり、クラスのメンバ関数を周辺で呼び出したくなる。その様な用途では、value_comp は使いづらい。そこで、比較演算子用のクラスは外で定義しつつ、std::set に使わせる方法を模索していた。

前回と同じ greater を用いる。

#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;
}
今回は、greater は main 関数で定義し、std::bind を利用して std::set に割り当ている。
% c++ value_comp3.cpp
% ./a.out 
desc sizeof 24
desc compare 0
これで、std::set 内のインスタンスを避けつつ、任意の比較演算子を渡すことが出来た。

前回