3.1命名空间中的using声明
using 声明语句:编译器从操作符左侧所示作用域寻找右侧那个名字
using namespace :: name
注:头文件中不能有using声明,头文件中的内容会拷贝到所引用它的文件中去,会引起名字冲突
3.2 标准库类型string
标准库类型string:表示可变长的字符序列。包含在string头文件
string的初始化方式
string s1
string s2(s1) s2是s1的副本
string s2 = s1 s2是s1的副本
string s3(“value”) s3是value的副本,除了字面值最后那个空字符
string s3 = “value”
string s4(n,‘c’) s4初始化为连续n个字符c组成的字符串
直接初始化和拷贝初始化(参考上述例子)
string 对象上的操作
s[n]、s.empty( )、s.size()、getline(is,s)等
getline(is,s):从is中读取一行赋给s,返回is
string对象会自动忽略开头的空白并从第一个真正的字符开始读起,直到遇到下一处空白。
**string :: size_type **
s.size()函数返回的是size_type类型。该类型是string类及其他大多数标准库类型都定义了几种配套的类型。
size_type是一种无符号类型的值。不能与int等有符号数混用,会产生意想不到的结果。例s.size()<n 中负值会被自动转换为无符号数进行比较。
注:在string比较中,比较规则。(字符相异)
string的运算符(+)的两侧至少有一侧是string对象
错误示例: string s1 = “hello” + ", " + s2 (其中s2是string 对象)
c语言中的头文件形如name.h在c++中命名为cname
处理str中每个字符(代码块中的部分函数为string标准库类型中的)
string s("some string");
for (auto c : s)
cout << c <<endl;
//引用迭代
for (auto &c : s)
c = toupper(c);
cout << s <<endl;
//使用下标进行迭代
for(decltype(str.size()) index = 0;
index != s.size() && !isspace(s[index]);++index)
s[index] = toupper(s[index]);
3.3标准库类型vector
标准库类型vector表示对象的集合,其中所有的对象类型都相同,且所有对象都有索引,用于访问对象。同时,vector也被称为“容器”。vector是一个类模板。c++中有类模板也有函数模板。
除string的初始化方式外,vector多了个列表初始化。
vector <T> v1 = {a,b,c......};
vector <T> v1{a,b,c....}; //两种方式是等价的
//错误示例:编译器检测到与元素类型不同,会执行默认初始化。
vector<string> v1{10};
vector<string> v1{10,"hi"}; //这两种方式会得到有10个默认初始化的元素
vector对象上的操作不做具体介绍。
3.4迭代器的介绍
迭代器有有效和无效之分。有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一位
auto b = v.beign(),e = v.end(); //b表示v的第一个元素,e表示v的尾元素的下一位置
如果容器为空,则v.begin()与v.end()返回的是同一个迭代器,都是尾后的迭代器。
此时需要用解引用改变字符。例如:
for(auto it = v.begin();it != v.end() && !isspace(*it);++it)
*it = toupper(*it);
迭代器类型
vector<int> v ;
const vector<int> cv;
auto it1 = v.begin(); //it1是vector<int>:: iterator类型
auto it2 = cv.begin(); //it2是vector<int>:: const_iterator类型
const_iterator类型只可以读不可以写。
为了得到const_iterator类型c++11新标准引入cbegin()和cend()函数。
迭代器调用函数时,正确的是(*it).empty( ),错误的是 *it.empty( )。
c++语言定义了箭头运算符(->)。箭头运算符把解引用和成员访问函数两个操作结合在一起。it->mem和 (*it).mem相同。
3.5数组
数组与vector不同点是数组的大小确定,不能随意向数组中增加元素。
string a[b]; //当b为常量时正确,否则错误。
int *parr[42]; //含有42个整型指针的数组。
不允许拷贝和赋值
int a [] = {1,2,3};
int a2[] = a; //错误,不允许一个数组初始化另一个数组。
a2 =a ; //错误,不允许把一个数组直接赋值给另一个数组。
int (*p)[10];
int (&p2)[10];
指针和数组
使用数组时,编译器一般会把它转化为指针。使用指针访问数组元素时注意解引用
string nums[] = {'one','two','three'};
string *p = nums; //等价于 p = &nums[0];
数组也具有begin()和end(),并于vector相同。
注意:函数strlen( a );其中a必须是以空字符结束。且不能用 string初始化 char*
用数组初始化vector对象
int int_arr[] = {0,1,2,3,4,5};
vector<int> ivec(begin(int_arr),end(int_arr));
多维数组的迭代
//ia为一个二维数组
for(auto &i : row)
for(auto col: row) //若要进行写操作需要写为 &col
cout << col << endl;
使用引用符&为了避免数组被自动转化为指针。