Strings (Basics)

std::string Manipulation

string.png

Literals

‘a’ // char Literal

“C string Literal”

auto a = "seven of";  // type of a is char const[]
auto b = a; // b refers to same object as a
a += " nine"; // ❌ COMPILER ERROR: can't be modified
auto c = "al" + "cove"; // ❌ COMPILER ERROR
std::string s = a; // a is copied into s
s += " nine"; // ✔ (s is std::string)

“std::string Literal”s C++14

#include <string>
using namespace std::string_literals;
auto s1 = "seven of"s; // type of s1 is std::string
auto s2 = s1; // s2 is a copy of s1
s1 += " nine"; // ✔
cout << s1 << '\n'; // seven of nine
cout << s2 << '\n'; // seven of
auto s3 = "uni"s + "matrix"s; // ✔
cout << s3 << '\n'; // unimatrix

Joining

String literals that are only separated by whitespace are joined:

"first" "second"` ⇒  `"first second"
std::string s = 
"This is one literal"
"split into several"
"source code lines!";

Raw String Literals

Advantage: special characters can be used without escaping

R"(raw "C"-string c:\users\joe)" char const[] C++11
R"(raw "std"-string c:\users\moe)"s std::string C++14

Syntax: R"DELIMITER(characters...)DELIMITER"

where DELIMITER can be a sequence of 0 to 16 characters except spaces, (, ) and \

String-Like Function Parameters

Use std::string_view for read-only parameters! C++17

  • lightweight (= cheap to copy, can be passed by value)
  • non-owning (= not responsible for allocating or deleting memory)
  • read-only view (= does not allow modification of target string)
  • of a string(-like) object (std::string/“literal”/…)
  • primary use case: read-only funtion parameters
#include <string>
#include <string_view>
int edit_distance (std::string_view s1, std::string_view s2) { … }
std::string input = "abx";
int dist = edit_distance("abc", input);
  • avoids expensive temporary strings when string literals are passed to functions
  • can speed up accesses by avoiding a level of indirection

string_view.png

If You… Use Parameter Type
always need a copy of the input string inside the function std::string “pass by value”
want read-only access, don’t (always) need a copy, are using C++17 / 20 #include std::string_view
want read-only access, don’t (always) need a copy, are stuck with C++98 / 11 / 14 std::string const& “pass by const reference”
want the function to modify the input string in-place (you should try to avoid such “output parameters”) std::string & “pass by (non-const reference)”

std::getline

  • read entire lines / chunks of text at once
  • target string can be re-used (saving memory)
std::string s;
getline(std::cin, s); // read entire line
getline(std::cin, s, '\t'); // read until next tab
getline(std::cin, s, 'a'); // read until next 'a'

References

https://hackingcpp.com/cpp/std/string_basics.html