第3章 字符串、向量和数组

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;

使用引用符&为了避免数组被自动转化为指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值