使用 stdstring 檢視類

Version >= C++ 17

C++ 17 引入了 std::string_view,它只是一個非擁有的 const chars 範圍,可以作為一對指標或指標和長度實現。對於需要不可修改的字串資料的函式,它是一種高階引數型別。在 C++ 17 之前,有三種選擇:

void foo(std::string const& s);      // pre-C++17, single argument, could incur
                                     // allocation if caller's data was not in a string
                                     // (e.g. string literal or vector<char> )

void foo(const char* s, size_t len); // pre-C++17, two arguments, have to pass them
                                     // both everywhere

void foo(const char* s);             // pre-C++17, single argument, but need to call
                                     // strlen()

template <class StringT>
void foo(StringT const& s);          // pre-C++17, caller can pass arbitrary char data
                                     // provider, but now foo() has to live in a header

所有這些都可以替換為:

void foo(std::string_view s);        // post-C++17, single argument, tighter coupling
                                     // zero copies regardless of how caller is storing
                                     // the data

請注意,std::string_view 無法修改其基礎資料

當你想要避免不必要的副本時,string_view 非常有用。

它提供了 std::string 所具有的功能的有用子集,儘管某些功能表現不同:

std::string str = "lllloooonnnngggg sssstttrrriiinnnggg"; //A really long string

//Bad way - 'string::substr' returns a new string (expensive if the string is long)
std::cout << str.substr(15, 10) << '\n';

//Good way - No copies are created!
std::string_view view = str;

// string_view::substr returns a new string_view
std::cout << view.substr(15, 10) << '\n';