第3章 字符串、向量和数组
命名空间的using声明
目前为止我们使用的库函数基本都属于命名空间std,如std::cin 、std::cout。其中:: 我们称其为作用域操作符,编译起编译起从操作符左侧名字的作用域寻找右侧那个名字。
但是上面很繁琐、允许我们通过using声明
#include<iostream>
using std::cout;
using std::endl;
int main(int argc,char**argv){
const char*name="gaowanlu";
cout<<name<<endl;
std::cout<<name<<std::endl;
return 0;
}
这样在这个cpp内使用std::cout与std::endl时就可以省略写std::了,但是仍然允许我们显式指定其明明空间
头文件不应包含using声明
头文件一般不使用using声明,因为头文件的内容会被拷贝到,include它的cpp去,如果头文件有using声明,则那些cpp内也会有这些using声明,可能会引起明明冲突
#ifndef __EXAMPLE2_H__
#define __EXAMPLE2_H__
using std::cout;
#endif
当第4行代码不被注释掉时,则会引入using std::cout; 当main函数内使用cout,编译器则不会知道知道我们要使用std::cout还是自定义的cout,进而产生命名出错
总之不要在头文件内使用using声明
#include<iostream>
#include<cstdio>
int cout(){
printf("printf hallo");
}
int main(int argc,char**argv){
cout();
return 0;
}
标准库类型string
首先要导入 #include<string> 其命名空间为 std::string
在C语言中是没有字符串类型的,但可以用字符数组进行存储,以 \0 表示字符串结束
定义和初始化string对象
6种直接初始化方式、1种拷贝初始化方式
1、string s5;
2、string s6(s5);
3、string s7 = "ak47";
4、string s8 = s7;
5、string s9("94");
6、string s10(1, 'h');
7、string s11=std::string("hello world");
样例程序
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main(int argc, char **argv)
{
string s1;
string s2 = "gaowanlu";
string s3 = s2;
string s4(4, 'a');
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
string s5;
string s6(s5);
string s7 = "ak47";
string s8 = s7;
string s9("94");
string s10(1, 'h');
cout << s5 << endl;
cout << s6 << endl;
cout << s7 << endl;
cout << s8 << endl;
cout << s8 << endl;
cout << s9 << endl;
cout << s10 << endl;
string s11 = std::string("hello world");
cout << s11 << endl;
return 0;
}
string对象上的操作
在C++中string是一种标准库里的对象,其支持丰富的操作
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
string s1("hello world");
string s2 = "hello world";
支持写入到输出流 outputstream<<str
cout << s1 << endl;
同理支持从输入流写入到字符串 inputstream>>s1
从输入流中读取一行到字符串getline(inputstream,str)
检测字符串是否为空字符串 str.empty()
cout << s1.empty() << endl;
获取字符串长度
cout << s1.size() << endl;
获取第n个字符的引用 n 0开始为第一个字符
char &ch = s1[0];
ch = 'p';
s1[3] = 'k';
cout << s1 << endl;
字符串拼接
string s3 = s1 + s2;
s3+="";
cout << s3 << endl;
cout << s3 + "HAHA" << endl;
字符串复制
string s4 = s3;
s4与s3没有关系,只是内容相同,它们的数据存放在不同的内存上面
cout << s4 << endl;
字符串的比较
cout << (s3 == s4) << endl;
cout << (s3 != s4) << endl;
字典顺序比较
string s5 = "abcd";
string s6 = "abda";
cout << (s5 < s6) << endl;
cout << (s5 <= s6) << endl;
cout << (s5 > s6) << endl;
cout << (s5 >= s6) << endl;
return 0;
}
getline函数的返回值
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
string s1;
while (getline(cin, s1))
{
cout << s1 << endl;
}
return 0;
}
std::string::size_type类型
其字符串size()方法返回值用什么类型存储比较好,C++为我们提供了std::string::sizetype类型
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
std::string s1("hello");
std::string::size_type s1_length = s1.size();
cout << s1_length << endl;
cout << sizeof(std::string::size_type) << endl;
auto l1 = s1.size();
decltype(s1.size()) l2 = s1.size();
cout << l1 << endl;
cout << l2 << endl;
unsigned l3 = s1.size();
int l4 = s1.size();
cout << l3 << " " << l4 << endl;
return 0;
}
字符串相加要注意的事
字符串字面值不能与字符串字面值相加、相加对于string对象有效,即+号的左右至少有一个string对象
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
string s2 = "a";
s2 = s2 + " b " + "c ";
cout << s2 << endl;
return 0;
}
这是为什么呢,C++为了与C语言兼容,所以C++语言中的字符串并不是作为std::stirng对象处理的
处理string对象中的字符
#include<cctype>
isalnum(c);
isalpha(c);
iscntrl(c);
isdigit(c);
isgraph(c);
islower(c);
isprint(c);
ispunct(c);
isspace(c);
isupper(c);
isxdigit(c);
tolower(c);
toupper(c);
如toupper使用
#include <iostream>
#include <cctype>
using namespace std;
int main(int argc, char **argv)
{
string s1 = "abc";
s1[1] = toupper(s1[1]);
cout << s1 << endl;
return 0;
}
遍历字符串字符
C++对于字符串的遍历支持迭代器模式
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main(int argc, char **argv)
{
string s1 = "abc";
for (char &ch : s1)
{
cout << ch << endl;
ch = toupper(ch);
}
cout << s1 << endl;
for (auto ch : s1)
{
cout << ch << endl;
ch = tolower(ch);
}
cout << s1 << endl;
return 0;
}
下标的随机访问
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
string s1 = "abcd";
if (s1.empty() == false)
{
cout << s1[s1.size() - 1] << endl;
}
return 0;
}
标准库类型vector
|