std::string_view
é uma classe de nome basic_string_view
que utiliza char
e std::char_traits
, ambos como template.
Ela está disponível somente a partir do C++17 e precisa incluir o cabeçalho string_view
. Pode ser implementada também para letras acentudas(std::wstring_view
), unicode 8(std::u8string_view
), 16(std::u16string_view
, C++20) e 32(std::u32string_view
) .
Ela praticamente cria um vector de caracteres para uma string .
Cada caractere é um índice:
T | e | r | m | i | n | a | l | R | o | o | t | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
É muito utilizada em códigos que fazem parser.
Vamos ver 10 exemplos de utilizá-la!
string_view
std::string_view sv {"Terminal Root"};
std::cout << sv << '\n';
std::cout << sv[3] << '\n'; // m
string_view
std::cout << sv.size() << '\n'; // 13
std::cout << sv.back() << '\n'; // t
'i'
std::cout << sv.find("i") << '\n'; // 4
std::cout << sv.rfind("o") << '\n'; // 11
Seria o 1º ‘o’ de trás para frente, o
find()
daria 10 . Outra observação é se você informar um caractere que não existe, dará garbage(string::npos
, um número esquisito).
'X'
std::cout << sv.find("X") << '\n'; // garbage
std::cout << sv.substr(9, 13) << '\n'; // Root
sv.remove_suffix(4);
std::cout << sv << '\n'; // Terminal
sv.remove_prefix(8);
std::cout << sv << '\n'; // ' Root'
É possível também usar string_view_literals
adicionando o termo sv
ao final, exemplo de código com literal:
#include <iostream>
#include <string_view>
using namespace std::string_view_literals;
int main(){
auto literal = "Terminal Root"sv;
std::cout << literal << '\n';
return 0;
}
Exemplo de um código pronto:
#include <iostream>
#include <string_view>
int main() {
constexpr std::string_view unicode[] {
"▀▄─", "▄▀─", "▀─▄", "▄─▀"
};
for (int y{}, p{}; y != 6; ++y, p = ((p + 1) % 4)) {
for (int x{}; x != 16; ++x)
std::cout << unicode[p];
std::cout << '\n';
}
}
Saída:
▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─
▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─
▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄
▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀
▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─
▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─
Algumas outras funções só estão disponíveis no C++20 ou C++23, exemplos: contains()
, starts_with()
e outros.
Para mais informações acesse: https://en.cppreference.com/w/cpp/string/basic_string_view .