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 内のインスタンスを避けつつ、任意の比較演算子を渡すことが出来た。

前回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2021/04/22/9369670/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。