写在前面
前几天看lc题解看到一个C++写法:""s
, 感觉之前没见过, 后来查看一番cppreference
1之后发现这个语法竟然是一个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及以上才行.