我们假设我创建了一个这样的字符串:
std::string s1 = "";
s1 += 'a';
s1 += 'b';
然后就是这样:
std::string s2 = std::string( "ab" );
s1
和s2
是否相等?创建\0
时,"ab"
是否会从s2
中删除?如果没有,是否有一种简单的(一行,最好)方式来检查s1
是否仅包含{'a', 'b'}
?
答案 0 :(得分:2)
s1和s2是否相等?
是
是否从" ab"剥离了\ 0什么时候创建s2?
这不是一个有意义的问题。构造s2
的代码可以根据需要构造。它可以复制终结器,删除它,保留它,无论它想要什么。它只需要知道如何找到C风格字符串的结尾,它确实如此。
如果没有,是否有一种简单的(一行,最好)方式来检查s1是否仅包含{' a'' b'}?
if (s1 == "ab")
string
类有一个operator==
可以达到你所期望的效果,比较等价值。它理解C风格和C ++风格的字符串是如何工作的,因此可以比较它们的值。
答案 1 :(得分:0)
使用方法大小()很容易确定会发生什么。
例如,在创建像这样的对象
之后std::string s1 = "";
s1的大小将等于0.
这里称为构造函数
basic_string(const charT* s, const Allocator& a = Allocator());
复制第一个元素由s指向的数组中的字符。由于字符串文字“”的长度等于0,因此构造的对象也没有元素,其大小等于0。
在这些陈述之后
s1 += 'a';
s1 += 'b';
该对象将包含两个字符'a'和'b'。
因此,对象将等于std::string( "ab" );
构建的对象。
例如,如果您有一个像
这样的字符数组,请考虑char s [] = {'a','b','\ 0','c','d','\ 0'};
将用于构造类似std :: string的对象,如此
std::string s1( s );
然后s1将只包含两个元素'a'和'b',其大小将等于2.
考虑另一个例子会很有用。我们假设你写了
std::string s1 = "";
然后
s1 += 'a';
s1 += 'b';
s1 += '\0';
在这种情况下,s1将不等于对象std::string( "ab" )
,因为s1的大小现在等于3.
另一个有趣的例子。您可以使用构造函数
basic_string(const charT* s, size_type n, const Allocator& a = Allocator());
它类似于前面的构造函数,除了它允许显式指定指针s指向的字符数组中的字符数,这些字符数将用于构造std :: string类型的对象。 在这种情况下,如果你要写
std::string s1( "ab", 3 );
std::cout << s1.size() << std::endl;
if ( s1 == std::string( "ab" ) ) std::cout << "They are equal" << std::endl;
else std::cout << "They are not equal" << std::endl;
然后输出
3
They are not equal
同时如果你要写
std::cout << s1 << std::endl;
你会看到
ab