C++ コンテナの value_comp の大きさが std::set に追加される2021年04月18日 18時31分17秒

C++ には、std::vector、std::set、std::map 等の汎用的なデータ構造が実装されている。その中の順序を保つ std::set や std::map 等は比較演算子を渡すことが出来る。代表的な使い方としては、昇順並びを降順並びに変える方法などがある。

この、比較演算子は value_comp() 関数で取得できる。特に、クラスを比較のために渡すと、そのままインスタンスが生成されるようだ。

#include <set>
#include <iostream>

struct greater
{
    char gap[ 1024 ];
    bool operator()( int l, int r ) const { return l > r; }
};

int main()
{
    std::set< int > asc;
    std::set< int, greater > desc;

    std::cout << "asc sizeof " << sizeof( asc.value_comp() ) << std::endl;
    std::cout << "asc compare "  << asc.value_comp()( 1, 2 ) << std::endl;

    std::cout << "desc sizeof " << sizeof( desc.value_comp() ) << std::endl;
    std::cout << "desc compare " << desc.value_comp()( 1, 2 ) << std::endl;

    std::cout << "sizeof " << sizeof( desc ) << std::endl;
}
これを実行すると greater の大きさが 1024 で、std::set の大きさが 1036 となっている。なお、この実験は clang を使っている。
% c++ value_comp.cpp
% ./a.out 
asc sizeof 1
asc compare 1
desc sizeof 1024
desc compare 0
sizeof 1036
二つの value_comp() に同じ値を渡すと、返って来る値が違うのが見て取れる。

次回

コメント

コメントをどうぞ

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

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

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

トラックバック

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

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