第三章 字符串、向量和数组
主要介绍两种重要的标准库 string 和 vector 还有内置数组类型。
3.1 命名空间的using声明
using声明具有以下格式:using namespace::name;
#include <iostream>
using std::cin;
int main()
{
int i;
cin >>i; //正确:cin和std::cin含义相同
cout<<i; //错误:没有指定那个命名空间
return 0;
}
个人理解:命名空间就相当于一个仓库,描述仓库里面的东西需要指定仓库,要不对方不知道是哪个仓库的东西。
- 每个名字都需要独立的using声明
- 头文件不应包含using声明
3.2 标准库类型string
标准库类型string: 表示可变长的字符串序列,使用string类型必须首先包含string头文件:
#include <string>
using namespace std::string;
3.2.1 定义和初始化string对象
#include <iostream>
#include <string>
using namespace std;
using namespace std::string;
int main()
{
string s1; //默认初始化,s1是一个空串
string s2(s1); //s2是s1的副本
string s2=s1; //等价于s2(s1),s2是s1的副本
string s3("value"); //s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s3="value"; //等价于s3("value"),s3是字面值"value"的副本
string s4(n,'c'); // 把s4初始化为由连续n个字符c组成的串
}
- 直接初始化和拷贝初始化
- 拷贝初始化:如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。
- 直接初始化:如果不使用等号,则执行的是直接初始化。
string s5="hiya"; //拷贝初始化
string s6("hiya"); //直接初始化
string s7(10,'c'); //直接初始化
3.2.2 string对象上的操作
- 读写string对象
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s; //空字符串
cin>>s; //将string对象读入s,遇到空白停止
cout<<s<<endl; //输出s
return 0;
}
- 读取未知数量的string对象
#include <iostream>
#include <string>
using namespace std;
int main()
{
string word;
while(cin>>word) //反复读取,直至到达文件末尾
{
cout<<word<<endl; //逐个输出单词,每个单词后面紧跟一个换行
}
return 0;
}
- 使用getline读取一整行
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
while(getline(cin,line)) //每次读取一整行
{
cout<<line<<endl; //输出整行
}
return 0;
}
- string的empty和size操作
- empty: 函数根据string对象是否为空返回一个对应的bool值。
- size : 函数返回string对象的长度
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
while(getline(cin,line)) //每次读取一整行
{
if(!line.empty()&&line.size()>80) //如果不为空 并且 字符数大于80
{
cout<<line<<endl; //输出整行
}
}
return 0;
}
- string::size_type类型
size函数返回的是一个 size_type,是一个无符号的整型数,如果在表达式中混用了带符号数和无符号数将可能产生一项不到的结果。 - 比较string对象
- 相等性运算符(==)
分别检验两个string对象相等或不相等,string对象相等意味着他们的长度相同而且所包含的字符也全部相同。 - 关系运算符
<、<=、>、>=分别检验一个string对象是否小于、小于等于、大于、大于等于另外一个string对象。
- 相等性运算符(==)
- 两个string对象相加
string s1="hello,",s2="world\n";
string s3=s1+s2; //s3的内容是hello,world\n
s1+=s2; // 等价于 s1=s1+s2
3.2.3 处理string对象中的字符
这段需要看标准库了,上面的已经够用了。
3.3 标准库类型vector
标准库类型vector 表示对象的集合,其中所有对象的类型都相同。因为vecotr容纳着其他对象,所以他们也被称作容器。
3.3.1 定义和初始化vector对象
- 初始化vector对象的方法
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> iVector; //初始状态为空
vector<string> sVector //初始化为空
//列表初始化
vector<string> articles={"a","an","the"};
//创建指定数量的元素
vector<int> iVector(10,-1); //10个int类型的元素,每个初始化为-1
}
3.3.2 向vector对象中添加元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> iVector; //空vector对象
//增加
for(int i=0;i<=100;i++)
{
iVector.push_back(i);
}
//遍历
for(int value in iVector)
{
cout<<"value"<<value<<endl;
}
return 0;
}
3.3.3 其他vector操作
注意:只能对确知已存在的元素才能执行下标操作
3.5 数组
数组可以理解为大小不变的标准库类型vector的数据结构。
3.5.1 定义和初始化内置数组
unsigned cnt=1024; //不是常量表达式
constexpr unsigned sz=1024; //常量表达式
int arr[10]; //含有10个整数的数组
int *parr[sz]; //含有10个整数指针的数组
string bad[cnt]; //cnt不是常量表达式
string strs[get_size()]; //当get_size是constexpr时正确;否则错误
/**
*显示初始化数组
*/
const unsigned sz=3;
int iArr[sz]={0,1,3};
int arr[]={0,1,3};
- 字符串的特殊性:字符串是以空格结尾的
char a1[]={'c','+','+'}; //列表初始化,没有空字符串
char a2[]={'C','+','+','\0'}; //列表初始化,含有显示的空字符串
char a3[]="C++"; //列表初始化,含有隐式的空字符串
const char a4[6]="Daniel"; //错误:没有空间可存放空字符串
- 不允许拷贝和赋值
int a[]={0,1,2}; //含有3个整数的数组
int a2[]=a; //错误: 不允许使用一个数组初始化另一个数组
a2=a; //错误:不能把一个数组直接赋值给另一个数组
3.5.2 访问数组元素
unsigned scores[11]={}; //11个分数段,全部初始化为0
unsigned grade;
while(cin>>grade)
{
if(grade<=100)
{
++scores[grade/10]; //将当前分数段的计算值加1
}
}
3.5.3 指针和数组
在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针
string nums[]={"one","two","three"};
string *p=&nums[0]; //等价于 *p=nums;
- 指针也是迭代器
int arr[]={0,1,2,3,4,5,6,7,8,9};
int *p=arr;
++p;
cout << "++p:" << *++p << endl;
3.5.4 C风格字符串
- C标准库String函数