梁子20163933
string表示可变长的字符串序列,vector存放的是某种给定类型对象的可变长序列。
命名空间的using声明
域作用符(::)用来将命令空间中的函数或对象进行调用。
可以使用using声明来使得可以直接访问命名空间或者命名空间中的某个函数。
可变长字符序列之string库
使用string库之前必须先包括其头文件和作用域。
#include<string>
using std::string;
定义和初始化string对象
分为直接初始化和拷贝初始化.
string s1;
string s2(s1);
string s3="liangzi";
string s4(s3);
string s4=s3;
string s5("liangzi");
string s6(100,'cc');
string对象上的操作
os<<s
is>>s
is=getline(is, s)
s.empty()
s.size()
s[n]
s1+s2
s1==s2
<, <=, >, >=
下面给出一个读写string对象的简单例子。
int main()
{
string s;
cout << "please input a string" << endl;
cin >> s;
cout << s << endl;
return 0;
}
使用getline读取一整行
与cin不同,如果一开始的输入是一个换行符,getline函数读取之后会得到一个空字符。
使用示例
int main()
{
string file_path, line;
fstream read_file;
cout << "please input the need read path" << endl;
cin >> file_path;
read_file.open(file_path);
while (!read_file.eof())
{
getline(read_file,line);
cout << line << endl;
}
read_file.close();
system("pause");
return 0;
}
字符串常量和string对象相加
必须注意C++中“+”左右至少有一个string对象,即两个字符串常量不能进行相加操作。
string s1="liangzi", s2="zuishuai";
string ss=s1+s2;
string sss=s1+"---------->>"+s2;
string ssss="liangzi"+"zuishuai";
对string对象中的字符进行处理
首先介绍一下c语言库中的一些常用函数
cctype(或ctype.h)
#incldue<cctype>
using std::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)
使用基于范围的for语句来遍历string对象中的每一个字符
范围for语句(range for)是c++11中提出的,这种语句可以实现对给定序列中的每一个值进行处理。
sting s("liangzid");
for(auto i:s)
{
cout<<i<<endl;
}
再给出一个统计标点符号的示例。
string s("liangzi zi zui shuai ! ");
i=0;
for (auto &c:s)
{
if (ispunct(c))
{
++i;
}
}
cout<<" the number of punctuation characters is : "<<i<<endl;
标准库类型vector
标准库类型vector表示同一类型的若干对象的集合,且集合中的每一个对象都有一个对应的索引。因为该向量(vector)容纳着这些对象,所以说vector也被称作是容器(container)。后面将会对容器进行更详细的介绍。
C++中既有类模板(class template),也有函数模板。模板本身不是类和函数,模板相当于是编译器为了生成类或者函数而编写的一份说明。编译器根据模板创建类或者函数的过程被称为实例化(instantiation)。
对于类模板,需要添加一些额外信息以确定模板到底实例化成什么样的类,一般来说,提供信息的方式为:再模板后面跟一对尖括号,里面放上相应的信息。
vector是一个类模板。
注释:在c++11中,两层vector的话必须在最后的两个尖括号处放置空格,即vector<vector<int> >
而非vector<vector<int>>
。
定义和初始化vector对象
与string的定义和初始化类似,vector的用法如下:
vector<Type> v1
vector<Type> v2(v1)
vector<Type> v3=v1
vector<Type> v4(n,val)
vector<Type> v5{a,b,c,...}
vector<Type> v6={a,b,c,...}
向vector对象中添加元素
使用 push_back() 函数来将一个元素压入vector对象的尾端。
vector<int> sequence;
for(int i=0;i !=100;i++)
{
sequence.push_back(i);
}
int main()
{
string file_path, line;
fstream read_file;
vector<string> all_lines;
cout << "please input the need read path" << endl;
cin >> file_path;
read_file.open(file_path);
while (!read_file.eof())
{
getline(read_file,line);
all_lines.push_back(line);
}
read_file.close();
system("pause");
return 0;
}
vector的其他使用注意
和使用string一样,也可以使用范围for语句进行处理。
比如对前面读取得到的vector向量进行逐元素的输出,则可以使用range for语句。
int main()
{
string file_path, line;
fstream read_file;
vector<string> all_lines;
cout << "please input the need read path" << endl;
cin >> file_path;
read_file.open(file_path);
while (!read_file.eof())
{
getline(read_file,line);
all_lines.push_back(line);
}
read_file.close();
for (auto &cc : all_lines)
{
cout << cc << endl;
}
system("pause");
return 0;
}
同样地,我们可以使用下标索引来访问vector<Type> CC
中的每一个元素,但是无法用下标来创造一个新的元素。
迭代器(iterator)
迭代器是一种机制(可以看作是一种类型),类似于指针类型,迭代器提供了对对象进行间接访问的方式。迭代器可以间接访问容器中的某个元素或者string对象中的某一个字符。迭代器可以访问某个元素,也可以从一个元素移动到另外一个函数。迭代器有有效无效之分,与指针相同,当迭代器指向某个元素或者尾元素的下一个位置时迭代器有效,其他情况均为无效。
使用iterator
一般利用begin和end来进行对容器的指向。begin成员负责返回第一个元素(或字符)的迭代器,end用来返回指向容器尾元素的下一个位置的迭代器——即该迭代器标记了容器的一个根本不存在的”尾后“(off the end)元素,用来表示我们已经处理完了容器中的所有元素。end成员返回的迭代器通常被称为**尾后迭代器(off-the-end iterator)**或尾迭代器(end iterator)。如果容器为空,则begin与end均返回尾迭代器。
详细见示例。
vector<int> liangzi{1,2,3,4,5};
auto begin_liangzi=liangzi.begin();
auto end_liangzi=liangzi.end();
iterator运算符
*iter
iter->mem
++iter
--iter
iter1==iter2
iter1 != iter2
迭代器的运算部分
略
数组
数组是一种类似于vector的数据结构,但是数组的长度是固定的。数组在提高了一点性能的同时丧失了一点灵活性。
定义和初始化内置数组
定义数组时必须指定数组的类型(不能使用auto),定义数组时中括号里的量一定要是常量或者常量表达式。不能使用一个数组对另外一个数组进行初始化。
int i=100;
constexpr int ii=100;
int array1[100];
int *parray[100];
string array2[i];
string array3[ii];
int a[ ]={1,2,3};
int aa[ ]=a;
int &liangzi[100]={1,2,3,...};
int *pliangzi[100];
int (*pliangzii)[100]=&array1;
int (&liangzia)[100]=array;
访问数组元素
使用下标访问
请发表评论