---------------
if ('a'<=ch && ch<='z')  // znak
---------------
if (islower(ch))         // maa litera
---------------
if (islower(ch,danish))  // maa litera w jzyku duskim
                         // (zaoenie, e danish jest nazw lokalizacji Dania)
---------------
template<typename C> struct char_traits { };
---------------
template<>
struct char_traits<char> {        // operacje char_traits nie powinny zgasza wyjtkw
    using char_type = char;
    using int_type = int;         // typ cakowitoliczbowej wartoci znaku
    using off_type = streamoff;   // przesunicie w strumieniu
    using pos_type = streampos;   // pozycja w strumieniu
    using state_type = mbstate_t; // wielobajtowy stan strumienia (39.4.6)
    //...
};
---------------
template<> struct char_traits<char>;
template<> struct char_traits<char16_t>;
template<> struct char_traits<char32_t>;
template<> struct char_traits<wchar_t>;

---------------
template<typename C,
         typename Tr = char_traits<C>,
         typename A = allocator<C>>
class basic_string {
public:
    using traits_type = Tr;
    using value_type = typename Tr::char_type;
    using allocator_type = A;
    using size_type = typename allocator_traits<A>::size_type;
    using difference_type = typename allocator_traits<A>::difference_type;
    using reference = value_type&;
    using const_reference = const value_type&;
    using pointer = typename allocator_traits<A>::pointer;
    using const_pointer = typename allocator_traits<A>::const_pointer;
    using iterator = /* zdefiniowane w implementacji */;
    using const_iterator = /* zdefiniowane w implementacji */;
    using reverse_iterator = std::reverse_iterator<iterator>;
    using const_reverse_iterator = std::reverse_iterator<const_iterator>;
    static const size_type npos = -1; // liczba cakowita reprezentujca koniec acucha
    //...
};
---------------
using string = basic_string<char>;
using u16string = basic_string<char16_t>;
using u32string = basic_string<char32_t>;
using wstring = basic_string<wchar_t>;
---------------
string address(const string& identifier, const string& domain)
{
    return identifier + '@' + domain;
}

void test()
{
    string t = address("bs","domena");
    cout << t << '\n';
}
---------------
char* address(const char* identifier, const char* domain)
{
    int iden_len = strlen(identifier);
    int dom_len = strlen(domain);
    char* addr = (char*)malloc(iden_len+dom_len+2); // pamitaj o miejscu na 0 i '@'
    strcpy(identifier,addr);
    addr[iden_len] = '@';
    strcpy(domain,addr+iden_len+1);
    return addr;
}

void test2()
{
    char* t = address("bs","domena");
    printf("%s\n",t);
    free(t);
}
---------------
void test3()
{
    string s1 = "Ring";
    if (s1!="Ring") insanity();
    if (s1<"Opera") cout << "check";
    string s2 = address(s1,"Valkyrie");

    char s3[] = "Ring";
    if (strcmp(s3,"Ring")!=0) insanity();
    if (strcmp(s3,"Opera")<0) cout << "check";
    char* s4 = address(s3,"Valkyrie");
    free(s4);
}
---------------
void test4()
{
    vector<string> vs = {"Grieg", "Williams", "Bach", "Handel" };
    sor t(vs.begin(),vs.end()); // zaoenie, e nie zdefiniowaem funkcji sort(vs)

    const char* as[] = {"Grieg", "Williams", "Bach", "Handel" };
    qsort(as,sizeof(*as),sizeof(as)/sizeof(*as),(int(*)(const void*,const void*))strcmp);
}

---------------
string s0;                      // pusty acuch
string s1 {"To takie proste!"}; // konstrukcja z acucha w stylu C
string s2 {s1};                 // konstruktor kopiujcy
---------------
string s3 {7};     // bd: nie ma string(int)
string s4 {'a'};   // bd: nie ma string(char)
string s5 {7,'a'}; // OK: 7 liter 'a'
string s6 {0};     // niebezpieczestwo: przekazanie nullptr
---------------
const char* p=0;   // ustawia p na "brak acucha"
---------------
string s6 {0};     // niebezpieczestwo: przekazanie nullptr
string s7 {p};     // moe, ale nie musi by OK - zaley od wartoci p
string s8 {"OK"};  // OK: przekazanie wskanika do acucha w stylu C
---------------
string s9 {string::npos,'x'}; // zgosi length_error
---------------
string ss {"Fleetwood Mac"};
string ss2 {ss,0,9};             // "Fleetwood"
string ss3 {ss,10,string::npos}; // "Mac"
---------------
void fill(istream& in, string& s, int max)
    // uywa s jako celu niskopoziomowego wejcia (uproszczone)
{
    s.reserve(max);            // zapewnienie odpowiedniej iloci alokowanej pamici
    in.read(&s[0],max);
    const int n = in.gcount(); // liczba wczytanych znakw
    s.resize(n);
    s.shrink_to_fit();         // eliminacja nadmiaru pojemnoci
}
---------------
vector<string> lines;
for (string s; getline(cin,s);)
    lines.push_back(s);
---------------
string first_name;
string second_name;
cin >> first_name >> second_name;
---------------
string s = "123.45";
auto x1 = stoi(s); // x1 = 123
auto x2 = stod(s); // x2 = 123.45
---------------
string ss = "123.4567801234";
size_t dist = 0;           // zmienna do zapisania liczby wczytanych znakw
auto x = stoi(ss,&dist);   // x = 123 (int)
++dist;                    // zignorowanie kropki
auto y = stoll(&ss[dist]); // x = 4567801234 (long long)
---------------
string s = " 123.45";
auto x1 = stoi(s); // x1 = 123
---------------
string s4 = "149F";
auto x5 = stoi(s4);             // x5 = 149
auto x6 = stoi(s4,nullptr,10);  // x6 = 149
auto x7 = stoi(s4,nullptr,8);   // x7 = 014
auto x8 = stoi(s4,nullptr,16);  // x8 = 0x149F

string s5 = "1100101010100101"; // binarny
auto x9 = stoi(s5,nullptr,2);   // x9 = 0xcaa5
---------------
stoi("Witaj, wiecie!");      // zgasza std::invalid_argument
stoi("12345678901234567890"); // zgasza std::out_of_range; errno=ERANGE
stof("123456789e1000");       // zgasza std::out_of_range; errno=ERANGE

---------------
void f(string& s)
{
    auto p = find_if(s.begin(),s.end(),islower);
    //...
}
---------------
void add_middle(string& s, const string& middle)  // dodaje drugie imi
{
    auto p = s.find(' ');
    s.insert(p,' '+middle);
}
void test()
{
    string dmr = "Dennis Ritchie";
    add_middle(dmr,"MacAlistair");
    cout << dmr << '\n';
}

---------------
void f()
{
    string s = "ale ja syszaem, e to dziaa nawet, jak si w to nie wierzy";
    s.replace(0,4,"");              // usuwa "ale" z pocztku
    s.replace(s.find("nawet"),5,"tylko");
    s.replace(s.find(" nie"),4,""); // skasowanie poprzez zamian na ""
    assert(s=="syszaem, e to dziaa tylko, jak si w to wierzy");
}
---------------
void f2()
{
    string s = "ale ja syszaem, e to dziaa nawet, jak si w to nie wierzy";
    s.replace(0,4,"").replace(s.find("nawet"),5,"only").replace(s.find(" nie"),4,"");
    assert(s=="syszaem, e to dziaa tylko, jak si w to wierzy");
}

---------------
void f()
{
    string s {"accdcde"};

    auto i1 = s.find("cd");  // i1==2 s[2]=='c' && s[3]=='d'
    auto i2 = s.rfind("cd"); // i2==4 s[4]=='c' && s[5]=='d'
}

---------------
string s {"accdcde"};

auto i3 = s.find_first_of("cd");      // i3==1 s[1]=='c'
auto i4 = s.find_last_of("cd");       // i4==5 s[5]=='d'

auto i5 = s.find_first_not_of("cd");  // i5==0 s[0]!='c' && s[0]!='d'
auto i6 = s.find_last_not_of("cd");   // i6==6 s[6]!='c' && s[6]!='d'

---------------
void user()
{
    string s = "Ala ma kota";
    string s2 = s.substr(0,3); // s2 == "Ala"
    s2 = "Ania";               // nie zmienia s
}

---------------
void f()
{
    string s = "Ala ma kota";
    string s2 = s.substr(0,3);   // s2 == "Ala"
    auto i1 = s.compare(s2);     // i1 ma warto dodatni
    auto i2 = s.compare(0,3,s2); // i2==0
}