【C++】std::charconv数値と文字列の相互変換を効率的に行う【標準ライブラリ】

【C++】std::charconv数値と文字列の相互変換を効率的に行う【標準ライブラリ】

std::charconvとは?

<charconv> は C++17 で導入された標準ライブラリで、数値と文字列の相互変換を効率的に行うための機能を提供します。 これまで std::stringstreamstd::stoi, std::stod などが使われていましたが、std::charconv は より軽量かつ高速な方法を提供します。

数値を文字列に変換(std::to_chars)

std::to_chars を使うことで、整数や浮動小数点数を文字列に変換できます。 これは従来の sprintfstd::to_string よりも高速です。

基本的な使用例


#include <iostream>
#include <charconv>
#include <array>

int main() {
    std::array buffer;
    int value = 12345;
    
    auto result = std::to_chars(buffer.data(), buffer.data() + buffer.size(), value);
    
    if (result.ec == std::errc()) {
        std::cout << "Converted: " << std::string(buffer.data(), result.ptr) << std::endl;
    } else {
        std::cout << "Conversion failed" << std::endl;
    }

    return 0;
}

基数を指定


#include <iostream>
#include <charconv>
#include <array>

int main() {
    std::array buffer;
    int value = 255;
    
    std::to_chars(buffer.data(), buffer.data() + buffer.size(), value, 16);
    
    std::cout << "Hex: " << buffer.data() << std::endl;
    
    return 0;
}

文字列を数値に変換(std::from_chars)

std::from_chars を使うことで、文字列を数値に変換できます。

整数変換


#include <iostream>
#include <charconv>
#include <string>

int main() {
    std::string str = "98765";
    int value;
    
    auto result = std::from_chars(str.data(), str.data() + str.size(), value);
    
    if (result.ec == std::errc()) {
        std::cout << "Parsed: " << value << std::endl;
    } else {
        std::cout << "Conversion failed" << std::endl;
    }

    return 0;
}

浮動小数点数の変換


#include <iostream>
#include <charconv>
#include <string>

int main() {
    std::string str = "3.14159";
    double value;
    
    auto result = std::from_chars(str.data(), str.data() + str.size(), value);
    
    if (result.ec == std::errc()) {
        std::cout << "Parsed: " << value << std::endl;
    } else {
        std::cout << "Conversion failed" << std::endl;
    }

    return 0;
}

std::charconvの利点

  • 高速: std::to_chars / std::from_charsstd::stringstream よりも高速
  • メモリ確保不要: 文字列クラスを介さずにバッファを直接操作可能
  • エラー処理が明確: std::errc による変換結果の判定

実践的な使用例

数値リストを変換


#include <iostream>
#include <charconv>
#include <vector>
#include <array>

int main() {
    std::vector numbers = {10, 20, 30, 40, 50};
    std::array buffer;
    char* ptr = buffer.data();
    
    for (int num : numbers) {
        auto result = std::to_chars(ptr, buffer.data() + buffer.size(), num);
        *result.ptr++ = ' '; // スペースで区切る
        ptr = result.ptr;
    }
    
    std::cout << "Numbers: " << buffer.data() << std::endl;
    
    return 0;
}

std::charconvの制限と注意点

  • 浮動小数点数の変換が C++17 では未対応(C++20 以降で利用可能)
  • バッファのサイズ管理が必要
  • エラーチェックを明示的に行う必要がある

まとめ

std::charconv は、C++ における数値と文字列の変換をより効率的に行うための新しい方法です。 特に、高速性やメモリ管理を重視する場面では非常に有用です。整数変換だけでなく、C++20 以降では浮動小数点数の変換もサポートされ、 ますます利用価値が高まっています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です