C++字符串字面量""s的使用方法

 
Category: C_C++

写在前面

前几天看lc题解看到一个C++写法:""s, 感觉之前没见过, 后来查看一番cppreference1之后发现这个语法竟然是一个C++14时候出现的字符串字面量定义的简洁语法, 下面来具体看看:

代码

#include <string>
#include <iostream>
// must with stdc++14
void print_with_zeros(const std::string note, std::string const& s) {
    std::cout << note;
    for (const char c : s) {
        (c ? std::cout << c : std::cout << "₀");
    }
    std::cout << " (size = " << s.size() << ")\n";
}
void t1() {
    using namespace std::string_literals;

    std::string s1 = "abc\0\0def";
    std::string s2 = "abc\0\0def"s;
    print_with_zeros("s1: ", s1);
    print_with_zeros("s2: ", s2);

    std::cout << "abcdef"s.substr(1, 4) << '\n';
    /*
    s1: abc (size = 3)
    s2: abc₀₀def (size = 8)
    bcde
    */
}

void t2() {
    // 使用字符串字面量
    using namespace std::string_literals;
    std::cout << std::max(1, 2) << std::endl;
    std::cout << std::max({1, 2, 34}) << std::endl;
    std::cout << std::max({"abc"s, "cde"s, "acc"s}) << std::endl;
    /*
    2
    34
    cde
    */
}


int main() {
    // t1();
    t2();
}

其中第一个函数是cppreference中给出的例子, 不知道里面的那个Unicode字符是啥, 反正能用来代表\0, 可以看出声明和不声明字符串字面量的区别还是很大的, 从typeid().name()也能看出来, 之前我写过一篇关于在C++中直接用双引号放入max()的初始化列表中比大小的文章, 已经分析过直接定义和通过string()构造函数定义的区别了, 一个是C风格的字符数组, 另一个才是C++支持的string容器, 那么, 有了这个新标准, 就能重新写字符串的定义了, 直接诶在双引号后面加上s即可, 并且如果觉得麻烦, 可以直接用using namespace std, 需要注意c++标准一定要在14及以上才行.

参考