April 30, 2022

C++ 17 - String_view

String by ref

עד היום היינו רגילים לעשות דברים כאלו:

1
2
3
4
5
6
7
8
void MyFunction(const std::string& name)
{
if(name == "admin"s)
{
GrantPermission();
}
// ....
}

או אם זה מתכנת שלא יודע C++ יותר מדי:

1
2
3
4
5
6
7
8
void MyFunction(const char* name)
{
if(std::strcmp(name, "admin")!= 0)
{
GrantPermission();
}
// ....
}

C++ 17 העניקה לנו Type חדש המבוסס על רעיון ה-Span למחרוזות!

string_view

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <string_view>
#include <iostream>

int main()
{
std::string hw { "Hello World"};

std::string_view view { hw };

std::cout << view;

return 0;
}

view הוא חלון לזיכרון כלשהו.
string_view הוא חלון לזיכרון רצוף בגודל מסוים המהווה רשימה של תווים.

כל מה ש-view מכיל הוא מצביע וגודל.
אפשרות ההצבעה לתוך מחרוזת מעניקה לנו יכולה לבצע מניפולציות ובדיקות מבלי להעתיק את המחרוזת!

למשל טקסט csv שבודקים איפה מופיע פסיקים:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
std::string row{ "1,Milk,20,6" };

std::string_view view{ row };

size_t prevIndex = 0;
size_t currIndex = 0;
auto lastIndex = view.find_last_of(",");

while ((currIndex = view.find_first_of(",", prevIndex)) != view.npos)
{
auto begin = prevIndex;
auto end = currIndex - prevIndex;
const auto& val = view.substr(begin, end);

std::cout << val << "\n";

if (currIndex == lastIndex)
{
const auto& val = view.substr(currIndex + 1, view.size() - currIndex);
std::cout << val << "\n";
break;
}
prevIndex = currIndex + 1;
}

הקוד עדיין מבצע בדיקה על מחרוזות אך בתצורה הזו אנחנו נמנעים מהעתקה של מחרוזות!
אם היינו עושים זאת בעזרת std::string בלבד היינו צריכים להיזהר לא להעתיק ולהשתמש ב-const std::string& על מנת לקבל ייחוס ולא העתקה.

כמו כן גם starts_with ו-ends_with שיכולות להיות מאוד שימושיות:

1
2
3
4
5
std::string str{ "Hello World, Bye" };
std::string_view view{ str };

view.starts_with("Hello");
view.ends_with("Bye");

כמה תכונות שחשוב לזכור:

  • string_view יכול להיות מועבר ע”פ ערך (בהעתקה) מכיוון שהוא אובייקט פשוט.
  • יש לו dtor טריויאלי - ז”א הוא לא מקצה מאחוריו זיכרון.
  • string_view עוזר לנו בלהימנע מבניית מופעי מחרוזות או העתקה.

אז ממליץ להתחיל להשתמש ב-string_view וזה עוד סיבה פשוטה למה כדאי לעדכן את גרסת ה-C++ שלכם :)


תודה על הקריאה!

על הפוסט

הפוסט נכתב על ידי Ilya, רישיון על ידי CC BY-NC-ND 4.0.

שתפו את הפוסט

Email Facebook Linkedin Print

קנו לי קפה

#Software#Cplusplus