【C++ primer】第3章 字符串、向量和数组 (1)


Part I: The Basics
Chapter 3. Strings, Vectors, and Arrays


3.1 命名空间 using 声明

using 声明的形式:using ::;

#include  
// using declaration; when we use the name cin, we get the one from the namespace std 
using std::cin; 
int main() 
{
	int i;
	cin >> i;       // ok: cin is a synonym for std::cin
	cout << i;      // error: no using declaration; we must use the full name
	std::cout << i; // ok: explicitly use cout from namepsace std
	return 0;
}

头文件不应包含 using 声明
因为头文件的内容会复制到包含它的程序文本中。如果头文件具有 using 声明,那么每个包含该头文件的程序都将使用 using 声明。因此,不打算使用指定库名称的程序可能会遇到意外的名称冲突。


3.2 标准库 string 类型

【C++ primer】第3章 字符串、向量和数组 (1)_第1张图片

#include  
using std::string;

定义和初始化 string 对象

表3.1 初始化 string 对象的方式

方式 含义
string s1 默认初始化;s1 是一个空字符串。
string s2(s1) s2 是 s1 的副本。
string s2 = s1 等价于 s2(s1),s2 是 s1 的副本。
string s3("value") s3 是字符串字面值的副本,不包含字面值最后的空字符。
string s3 = "value" 等价于 s3(“value”),s3 是字符串字面值的副本。
string s4(n, 'c') 使用 n 个字符 ‘c’ 的副本初始化 s4。

直接初始化和拷贝初始化

string s5 = "hiya";  // copy initialization 
string s6("hiya");   // direct initialization 
string s7(10, 'c');  // direct initialization; s7 is cccccccccc

string s8 = string(10, 'c'); // copy initialization; s8 is cccccccccc

不推荐 s8 的初始化方式。

string 对象上的操作

表3.2 string 的操作

操作 含义
os << s 将 s 写入输出流 os 中。返回 os。
is >> s 从 is 中读取以空白分隔的字符串,赋给 s。返回 is。
getline(is, s) 从 is 中读取一行输入数据,赋给 s。返回 is。
s.empty() 如果 s 为空,返回 true;否则返回 false。
s.size() 返回 s 中字符的个数。
s[n] 返回 s 中第 n 个字符的引用;位置从 0 开始。
s1 + s2 返回 s1 和 s2 连接后的字符串。
s1 = s2 用 s2 中的副本代替 s1 中原来的字符。
s1 == s2 如果 s1 和 s2 中的字符完全一样,则它们相等。相等性判断对字母大小写敏感。
s1 != s2 见上。
<, <=, >, >= 比较判断对字母大小写敏感,且使用字典顺序。

读取未知数量的 string 对象

int main() 
{
	string word;
	while (cin >> word)       // read until end-of-file
		cout << word << endl; // write each word followed by a new line
	return 0;
}

使用 getline 读取一整行

int main() 
{
	string line;    
	// read input a line at a time until end-of-file
	while (getline(cin, line))
		cout << line << endl;
    return 0;
}

string::size_type 类型

auto len = line.size(); // len has type string::size_type 

字符串相加

string s1  = "hello, ", s2 = "world\n"; 
string s3 = s1 + s2;   // s3 is hello, world\n 
s1 += s2;   // equivalent to s1 = s1 + s2

string s4 = s1 + ", ";           // ok: adding a string and a literal 
string s5 = "hello" + ", ";      // error: no string operand 
string s6 = s1 + ", " + "world"; // ok: each + has a string operand 
string s7 = "hello" + ", " + s2; // error: can't add string literals

处理 string 对象中的字符

表3.3 cctype 头文件中的函数

函数 含义
isalnum(c) 当 c 是一个字母或数字时为 true。
isalpha(c) 当 c 是一个字母时为 true。
iscntrl(c) 当 c 是一个控制字符时为 true。
isdigit(c) 当 c 是一个数字时为 true。
isgraph(c) 当 c 不是空格但可打印时为 true。
islower(c) 当 c 是一个小写字母时为 true。
isprint(c) 当 c 是一个可打印字符时为 true,即 c 是空格或具有可视形式。
ispunct(c) 当 c 是一个标点符号时为 true,即 c 不是控制字符、数字、字母或可打印空白。
isspace(c) 当 c 是空白时为 true,即 c 是空格、制表符、纵向制表符、回车符、换行符或换页符。
isupper(c) 当 c 是一个大写字母时为 true。
isxdigit(c) 当 c 是一个十六进制数字时为 true。
tolower(c) 如果 c 是一个大写字母,返回对应的小写字母;否则原样返回 c。
toupper(c) 如果 c 是一个小写字母,返回对应的大写字母;否则原样返回 c。

建议:使用 C 标准库头文件的 C++ 版本
C 语言头文件的形式为 name.h,C++ 将这些版本命名为 cname。名字前面的字母 c 表示这个头文件是 C 标准库的一部分。
因此,cctype 头文件有与 ctype.h 头文件中一样的内容,但是形式上更适合 C++ 程序。
定义在 cname 头文件中的名字定义在 std 命名空间,name.h 头文件则不然。

C++11 标准:基于范围的 for 语句

for (<declaration> : <expression>)
	<statement>

统计 string 对象中标点符号的个数:

string s("Hello World!!!"); 
// punct_cnt has the same type that s.size returns; see § 2.5.3 (p. 70) 
decltype(s.size()) punct_cnt = 0; 
// count the number of punctuation characters in s 
for (auto c : s)        // for every char in s
	if (ispunct(c))     // if the character is punctuation
		++punct_cnt;    // increment the punctuation counter 
	cout << punct_cnt << " punctuation characters in " << s << endl;

使用范围 for 语句改变 string 对象中的字符

string s("Hello World!!!"); 
// convert s to uppercase 
for (auto &c : s)   // for every char in s (note: c is a reference)
	c = toupper(c); // c is a reference, so the assignment changes the char in s 
cout << s << endl;

下标运算符([])的使用
将 0 ~ 15 范围内的十进制数转换为十六进制数:

const string hexdigits = "0123456789ABCDEF"; // possible hex digits 
cout << "Enter a series of numbers between 0 and 15"
     << " separated by spaces. Hit ENTER when finished: "
     << endl; 
string result;        // will hold the resulting hexify'd string 
string::size_type n;  // hold numbers from the input 
while (cin >> n)    
	if (n < hexdigits.size())    // ignore invalid input        
		result += hexdigits[n];  // fetch the indicated hex digit 
cout << "Your hex number is: " << result << endl;

学习目录:【C++ primer】目录

你可能感兴趣的:(C++,学习笔记)