boost::string_ref

部分文字列に対する操作で、以下のような処理をよく書くと思います。

#include <string>

std::string extract_part(const std::string& str)
{
    return str.substr(2, 3);
}

int main()
{
    if (extract_part("ABCDEFG").front() == 'C') {
        ...
    }
}

std::stringのメンバ関数を使いたいからchar配列からstd::stringに変換し、部分文字列を得るためにsubstr()メンバ関数を使っています。
しかしそのためにstd::stringの一時オブジェクトができてしまうので、効率はよくありません。


Boost 1.53.0から、このような場合に使用するstring_refというクラスが導入されました。これは以下のように使用します。

#include <boost/utility/string_ref.hpp>

boost::string_ref extract_part(boost::string_ref str)
{
    return str.substr(2, 3);
}

int main()
{
    if (extract_part("ABCDEFG").front() == 'C') {
        ...
    }
}

boost::string_refは、内部的に文字配列へのポインタと長さのみを持つため、一時的な操作のためにフリーストアが必要になることはありません。
ここではchar配列をstring_refに渡していますが、std::basic_stringオブジェクトもstring_refに渡せます。


参照:
string_ref class - Boost Utility Library