c++学习笔记五——标准库类型vector与string

C++中除了像int ,float等一些基本类型外,C++还定义了内容丰富的的抽象数据类型标准库。其中最重要的标准库类型是string和vector,他们分别定义了大小可变的字符串和集合。
1 标准库string类型
1.1 string 对象的定义以及初始化

//构造函数是一个特殊的成员函数,定义如何初始化该类型的对象
string s1 // 默认构造函数,s1为空串
string s2(s1) //将s2初始化s1的副本
string s3("value") //将s3初始化一个字符串字面值的副本
string s4(n,'c') //将s4初始化为字符串‘c’的n个副本

1.2 string 对象的操作

s.empty()     //如果s为空串,则返回true,否则返回false
s.size()      //返回s中字符的个数

任何储存string 的size操作结果的变量必须为 string::size_type类型。特别重要的是,不要把size的返回值赋给一个int 变量。(为了避免溢出)
2 标准vector类型
vector是同一种类型的对象集合,每个对象都有一个对应的整数索引值,标准库将负责管理与储存元素相关的内容,将vector称为容器。使用vector需要引用
#include
using std::vector;
2.1 vector 对像的定义和初始化

vector[T] v1; //vector 保存类型为T的对象。默认构造函数v1为空
vector[T] V2(V1) //V2是v1一个副本
vector[T] v3(n,i) //v3包含n个值为i的元素
vector[T] v4(n);  //v4含有值初始化的元素n个副本

2.2值初始化
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。具体值为何,取决于储存在vector中元素的类型。

vector<int> fvec(10); //十个元素每个元素都是0
vector<string> svec(10);//十个元素每个元素都是空的

2.3 vector 对象操作

v.empty   //如果V为空,则返回true,否则返回false
v.size()  //返回V中的元素个数
v.push_back(t) //在V的末尾增加一个值为t的元素

成员函数 size 返回相应的vector类定义的 size_type值

vector<int>::size_type

2.4 向 vector 添加元素
push_back() 操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面。
vector下标操作 vector中对象是没有命名的,可以按vector中对象的位置来访问他们。通常使用下标操作符来获取元素。与string类似。但是下标操作并不添加元素

vector<int> ivec;
for(vector<int>::size_type i=0;i != 10;++i)
ivec[i]=i;//这样赋值是错误的,因为ivec是vector对像,下标只能用于获取已存在的元素。
ivec.push_back(i);//正确的赋值方法
//试图对不存在的元素进行下标操作是程序设计过程中严重的错误,可以导致“缓冲区溢出”,一定注意,仅仅能够对确知已存在的元素进行下标操作。

除了通过下标访问vector容器的元素外,我们还可以通过迭代器访问元素,迭代器是一种检查容器内元素并遍历元素的数据类型。
标准库为每一种容器提供了一种迭代器类型。迭代器提供了比下标操作更通用化的方法。

2.5容器的iterator类型

vector <int> ::iterator iter;   //这条语句定义了一个Iter的变量,它的数据类型是由vector::iterator 类型

vector 迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。以下是练习认识的一个例子

# include 
# include
# include
using namespace std;
int main()
{
	int i = 0;
	vector<int> vec(10);
	for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++,i++)
	{
		*iter =i;
		cout << "当前值" << *iter << endl;
		++iter ;
		*iter = i + 1;
		cout << "下一个" << *iter<<endl;

	
	}
	return 0;
}

可以看到通过对 iter的自增来移动迭代器指向的位置。以下是迭代器的一些算术操作

iter+n iter-n //可以对迭代对象加上或减去一个整型值,这样做将产生一个新的迭代器,其位置在iter所指元素之前(加)或之后(减)n个元素的位置。
iter1-iter2 //计算两个迭代器对象之间的距离,该距离是difference_type的signed类型的值,这里与size_type值相似,也是vector ::difference_type

2.6 begin和end操作

每种容器都定义了一对名为begin和end的函数,用于返回迭代器,如果容器中有元素的话,由begin返回的迭代器指向第一个元素。由end返回的元素并不指向容器的任何元素,指向最后一个元素的下一个元素,它只是起一个哨兵的作用。
以下是给一个vector容器元素赋值并且将其打印的例程。其中用到了迭代器 iterator,以及size_type的使用

# include 
# include
# include
using namespace std;
int main()
{
	int i = 0;
	vector<int> vec;
	for (vector<int>::size_type i=0;i!= 10;i++)
	{
		vec.push_back(i);
	   vector<int>::iterator iter=vec.begin();
	   iter = iter + i;
	   cout << "the value is " << *iter << endl;

	
	}
	return 0;
}

补充,容器大小的操作

c.szie() //返回容器C中的元素个数,返回类型为 C::size_type
c.max_size() //返回容器C中可容纳的最多元素个数
c.empty() //返回标记容器大小是否为0的布尔值
c.resize(n) //调整容器c长度大小,实施能够容纳n个元素,如果
c.resize(n,t) //调整容器c的大小,使其能够容纳n个元素,所有新添加的元素都为t
//要注意在使用resize时防止迭代器失效

你可能感兴趣的:(C++,c++,编程语言,数据结构)