如何检查是否设置了std :: string?


72

如果使用char*,我可以将其初始化为NULL,然后通过比较来检查它是否被设置。如何做一个相同的事情std::string?如何检查字符串是否设置?

编辑:如果我设置为字符串也为空怎么办?我是否必须使用其他标志来检查是否std::string设置了?


1
你为什么要这种行为?
jfs

Answers:


119

用途empty()

std::string s;

if (s.empty())
    // nothing in s

4
如果字符串是什么,该怎么办""
nakiya

3
@nakiya:那是空的。std::string不是指针,则不能为其分配null。
GManNickG

因此,基本上,如果我分配的字符串可以是包括在内的任何内容"",我都必须保留另一个字符串bool或其他内容来检查它是否已设置。:S
nakiya 2010年

1
@nakiya:要么std::string像Michael Burr所建议的那样,要么使用指向a的指针。或者使用提供此类功能的包装器(如Boost.Optional)。
James McNellis 2010年

1
@nakiya自C ++ 17起std::optional,您可以用作包装器来表示未实例化的字符串。像James McNellis一样,已经提出了Boost的等效方法。
托马斯

26

正如几个答案所指出的那样,std::string它的价值没有“零”的概念。如果使用空字符串作为这样的值是不够的(即,您需要区分没有字符的字符串和没有值的字符串),则可以使用astd::string*并将其设置为NULL或a有效std::string实例。

您可能需要使用某种类型的智能指针类型(boost :: scoped_ptr或其他类型)来帮助管理std::string将指针设置到的任何对象的生命周期。


6
您也可以使用boost::optional<std::string>。模板的boost::optional<T>存在恰好是为了支持自然不具有它的类型的“零空”。
MSalters 2010年

19

你不能 至少不能用同样的方法测试指针是否为NULL

一个std::string对象总是被初始化并且总是包含一个字符串。默认情况下,其内容为空字符串("")。

您可以测试是否为空(使用s.size() == 0s.empty())。



2

std :: string的默认构造函数始终返回设置为空字符串的对象。


11
为了清楚std::string() == std::string("")
起见

0

我认为您无法使用std :: string类来判断。但是,如果您确实需要此信息,则始终可以从std :: string派生一个类,并使派生的类具有分辨自构造以来(或其他任意时间)是否已更改的能力。或者更好的方法是,编写一个新的包装std :: string的类,因为鉴于缺少基类的虚拟析构函数,从std :: string派生可能不是一个好主意。这可能是更多的工作,但是要获得最佳解决方案,往往需要做更多的工作。

当然,您始终可以假设它是否包含“”以外的其他内容,则说明它已被“设置”,尽管这不会检测到手动将其设置为“”。


1
从标准库容器公开派生通常是一个坏主意,因为它们没有虚拟析构函数。将a封装std::string为成员变量会更好。
James McNellis 2010年

@James McNellis:我明白这一点。我将其纳入答案。
PatrickV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.