- 主题:一个简单的例子说明string_view的好处
在以下代码里,除了最后赋值给成员变量,中间所有步骤都无须拷贝
=================================================================
class Person {
public:
bool SetName(string_view name) {
if (name.empty()) {
return false;
}
auto [first_name, last_name] = GetFirstLastName(name);
if (!ValidateFirstName(first_name) || !ValidateLastName(last_name)) {
return false;
}
first_name_ = first_name;
last_name_ = last_name;
return true;
}
private:
// Return value is only valid if the input string is still in lifetime.
pair<string_view, string_view> GetFirstLastName(string_view name) {
int i = 0;
while (i < name.size() && name[i] != ' ') {
++i;
}
string_view first_name = name.substr(0, i);
string_view last_name = name.substr(i);
return {first_name, last_name};
}
bool ValidateFirstName(string_view) {
// TODO: add real validation logic.
return true;
}
bool ValidateLastName(string_view) {
// TODO: add real validation logic.
return true;
}
string first_name_;
string last_name_;
};
int main() {
Person p;
p.SetName("James Bond");
string request = "AGENT:James Bond"; // suppose this data is coming from outside source.
constexpr string_view agent = "AGENT:";
string_view r = request;
CHECK(r.starts_with(agent));
r.remove_prefix(agent.size());
p.SetName(r);
return 0;
}
--
修改:here080 FROM 76.126.252.*
FROM 76.126.252.*
如果你使用absl库的话,一早就够用了。
absl库里的string库非常好用。
【 在 poocp 的大作中提到: 】
: 直到C++20,string_view的成员函数才补充到差不多够用。
--
FROM 76.126.252.*
另外,我这段代码中有一个小BUG,有兴趣的朋友可以试着找一下。
【 在 here080 的大作中提到: 】
: 在以下代码里,除了最后赋值给成员变量,中间所有步骤都无须拷贝
: =================================================================
: class Person {
: ...................
--
FROM 76.126.252.*
haha,不错
【 在 vonNeumann 的大作中提到: 】
: last_name 前面会多一个空格?
:
--
FROM 76.126.252.*
并不比c string更危险。
无脑作为函数参数使用是完全安全的。
【 在 ilovecpp 的大作中提到: 】
: 这东西挺危险的,明明是个引用,语法上却像个值对象。用的人可能注意不到它可能失效。
--
FROM 76.126.252.*
???被调用者是什么意思?函数?写这个函数的作者出了问题跟你用不用string_view完全没有关系啊。你完全不用string_view,这个函数的作者还是可以瞎搞啊。
我说了,无脑把参数类型写成string_view是没有风险的。
要不你给个例子说明一下?
char*一看都不知道是个啥玩意啊,完全可能是个堆上的buffer,需要delete的那种。
【 在 ilovecpp 的大作中提到: 】
: 你无法阻止被调用者把它传到外面。这一点上它和char*确实一样危险,但char*无论定义还是使用的语法都明显是个指针,而string_view太像string。
: C++里常见的看着像值对象,而实际是引用的,好像就weak_ptr和iterator,但前者自带防止失效的机制,而且两者使用时的语法都像指针。
: 不过问题也不止这一个,现在ranges & views又来了。
--
FROM 76.126.252.*
一个意思
(具体是delete还是free得看你是new出来的还是malloc出来的)
【 在 sixue1999 的大作中提到: 】
: char*可以delete吗,free吧
--
FROM 76.126.252.*
可以new char[]
【 在 sixue1999 的大作中提到: 】
: char也可以new啊
: char要new的话,上一次new一个字符吗
:
--
FROM 76.126.252.*
不明白你说的这个跟string_view有什么关系。
另外,这条原则在C++里已经不适用了。使用unique_ptr之后对象均有清晰的所有权。
【 在 IOIII 的大作中提到: 】
: 谁创建谁销毁
:
--
FROM 76.126.252.*
你这跟之前的讨论的点已经完全不对路了。
之前在说“你无法控制BLABLA”
我给出的答案是无脑把参数类型改成string_view不会增加任何额外的风险。这比用char*强。
对于char*来说,你无法控制你只是使用者。有可能你需要销毁它。
【 在 IOIII 的大作中提到: 】
: 我是针对你说的char*来说的,如果你只是使用者,不必管它是否需要销毁
:
--
FROM 76.126.252.*