【現代C++】オリジナル文字列-raw string literal

3212 ワード

今日、C++11は、元の文字列(raw string literal)という小さなが非常に有用な特性を導入します.
背景
各プログラムでは、文字列の字面量にほとんど適用されます.しかし、従来の文字列の字面量の文法は、特殊な文字を持つ字面量のサポートに友好的ではなく、文字列内の特殊な文字を表すためにいくつかのエスケープ文字を導入しています.
\a   (BEL)
\b   (BS)
\f   (FF)

(LF) \r (CR) \t (HT) \v (VT) \\ \? \' \" \0 (NULL)

これによる問題は単純な文字列にはそれほど大きくないが、いくつかの特殊な応用には明らかに力が入らない.例えば、正規表現:\\d{3}-\\d{8}|\\d{4}-\\d{7}正規表現が大量に使われている\反スラッシュがエスケープシーケンスの始まりとして使われているため、文字列には\\エスケープが必要である.この文法は問題を解決できるが、明らかに、可読性は非常に悪い.シーンをもっと複雑に適用すると、多くの人が反スラッシュを数えるために多くの時間を費やしていると推定されます.\d{3}-\d{8}|\d{4}-\d{7}と直接表示できれば、どんなにいいだろう.
構文
C++11はついに行動し,元の文字列を導入した.最も基本的な使い方はR"(...)"で、Rで始まる、二重引用符で囲まれている(...)、実際の文字列は小括弧内の内容、小括弧は文字列のデリミタです.もちろん、左括弧と右括弧はトップ対応です.
「元」の文字列に現れる文字は、1つは1つ、2つは2つで、意味を変えることはありません.つまり、従来の"
"
文字列末尾文字を除いて改行文字のみを含むが、元の文字列R"(
)"
反スラッシュと文字を含むnと明らかに異なる.
今から見れば、問題はよく解決されているようですが、文字列に)"、例えばR"( : "(x,y)")"が含まれている場合、コンパイラは愚かです."(2つの)"に対応しているからです.この場合、R"&( : "(x,y)")&"のような他のデリミタを選択することができます.文法は以下の通りです.R"delim(...)delim"delimの選択は比較的柔軟で、最長16文字を超えず、括弧、空白、制御文字、反スラッシュではありません.
適用
背景には、正規表現に元の文字列が適用されますが、シーンはこれだけではありません.たとえば、次のようになります.
  • Windowsファイルパス
  • R"(C:\ProgramFiles\xx\xx\xx.exe)"
  • Json文字列
  • R"({"name":"xx","age":10})"

    洛谷での最初の問題:
    この問題は他のテクニックで解くことができます.ここでは、元の文字列を使用する解法のみを示します.
    #include
    
    int main() {
        std::cout << R"(                ********
                   ************
                   ####....#.
                 #..###.....##....
                 ###.......######              ###            ###
                    ...........               #...#          #...#
                   ##*#######                 #.#.#          #.#.#
                ####*******######             #.#.#          #.#.#
               ...#***.****.*###....          #...#          #...#
               ....**********##.....           ###            ###
               ....****    *****....
                 ####        ####
               ######        ######
    ##############################################################
    #...#......#.##...#......#.##...#......#.##------------------#
    ###########################################------------------#
    #..#....#....##..#....#....##..#....#....#####################
    ##########################################    #----------#
    #.....#......##.....#......##.....#......#    #----------#
    ##########################################    #----------#
    #.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
    ##########################################    ############ )";
    }

    上記の例では、元の文字列の他の2つの利点も発見できます.
  • 改行は他の方法をうまく残すためには人手が必要
    改行を実現する.
  • 文字列をコピーしてコピーした文字列をそのまま置き換えるのが便利R"(...)"の中の...で、タスクが完了してとても便利です.他の方法では、コピーに介入する文字列が多すぎて、エラーが発生しやすいです.

  • 引き続き私の公衆番号の文章に注目してください.