STL的常见用法(1)

1.vector 定义:vector<typename> name;

typename 表示可以是任何基本类型,int, doubel, char, 结构体,也可以是STL标准容器,例如vector, set, queue 等。

例如:vector<vector<int> > name;相当于一个二维数组只不过这个是变长的。

2.vector 容器内元素的访问;一般有两种形式@1:下标访问,@2:通过迭代器访问。

迭代器(iterator)可以理解为一种类似指针的东西,定义:vector<typename>::iterator it;可以通过*it来访问vector里面的元素。

int main(){
	ios::sync_with_stdio(false);
	vector<int>v;
	for(int i = 1; i <= 5; i++){
		v.push_back(i);
	}
	vector<int>::iterator it = v.begin();
	for(int i = 0; i < 5; i++){
		printf("%d ",*(it + i));
	}
	printf("\n");
	for(int i = 0; i < 5; i++){
		printf("%d ",v[i]);
	}
	printf("\n");
	for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
		printf("%d ", *it);
	}
	return 0;
}

在常用STL容器中,只有在vector和string中,才允许使用v.begin() + 3这种迭代器加上整数的写法。

int main(){
	ios::sync_with_stdio(false);
	vector<int>v;
	for(int i = 1; i <= 5; i++){
		v.push_back(i);
	}
	v.insert(v.begin() + 2, -1); //用来向vector的任意迭代器it插入一个元素x,时间复杂度o(n) 
	//v.pop_back();//pop_back()用来删除vector尾元素。size()获得vector中元素个数 
	//erase()有两种用法,删除单元格,删除一个区间[)的所有元素,时间复杂度为o(n)
	//v.erase(v.begin() + 3); 
	//for(int i = 0;i < v.size(); i ++){
	//	printf("%d ",v[i]);
	//}
	v.erase(v.begin()+1,v.begin()+2);
	for(int i = 0;i < v.size(); i ++){
		printf("%d ",v[i]);
	}
	printf("\n");
	//v.clear();//清空vector中所有元素 
	//printf("%d\n",v.size()); 
	
	return 0;
}

set的常见用法:

set的定义:set<typename> name;定义贺vector的一样。大部分stl都是这样定义的。

set元素的访问;由于除开vector和string之外的stl容器都不支持*(it+i)的访问形式。

int main(){
	set<int>s;
	s.insert(3);//insert(x)将x插入set容器中,并且自动排序和去重时间复杂度o(logn) 
	s.insert(5);
	s.insert(2);
	s.insert(3);
	s.insert(6);
	s.insert(7);
	for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
		printf("%d ",*it);
	}
	printf("\n");
	//find()函数返回set中对应为value的迭代器,时间复杂度为olog(n) 
	printf("%d\n",*(s.find(5)));
	//erase()函数有两种用法:删除单个元素,删除一个区间内的所有元素;
	//删除单个元素有两种方法删除迭代器,或者直接删除value. 
	//s.erase(s.find(2)); 
	//s.erase(2);
	//区间删除[);
	//size()返回set内元素的个数。时间复杂度o(1) 
	printf("%d\n",s.size()); 
	s.erase(s.find(3),s.end()); 
	for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
		printf("%d ",*it);
	}
	printf("\n");
	//clear()清空set的所有元素时间复杂度o(n)
	s.clear();
	printf("%d\n",s.size());	
	return 0;
}

使用find函数要判断元素是否存在只是要使用迭代器:

set<int>s;
	for(int i = 1; i <= 5; i++)s.insert(i);
	set<int>::iterator iter;
	iter = s.find(5);
	if(iter!=s.end()){
		cout << *(s.find(5)) << endl;
	}else{
		cout << "no thanks" << endl;
	}

set中元素是唯一的,如果需要处理不唯一的情况,则可以使用multiset。另外还增加了unordered_set,以散列表代替set内部的红黑数。可以用来处理只去重不排序的需求,速度比set快的多。

string的常见用法:

string的定义:string str;

int main(){
	string str, str2, str3;
	//如果要读入和输出整个字符串,则只能用cin和cout;
	//可以使用c_str()来用printf()输出字符串,把字符串转化为字符数组; 
	//cin >> str;
	//printf("%s\n",str.c_str()); 
	//string可以使用+法可以直接比较大小。 
	//length()//size()返回字符串的长度 
	//insert()时间复杂度o(n)
	//insert(pos, string);在Pos号位置插入字符串string 
	//insert(it, it2, it3); it为原字符串,it2,it3为待插字符串的首尾迭代器用来表示[it2, it3)将被插入在it位置上 
	//cin >> str2 ;
	//str3 = str2 + str;
	//cout << str3 << endl; 
	//str3.insert(3,str2);
	//cout << str3 << endl;
	//cout << str3.length() << " " << str3.size() << endl;
	//str = "wefgy";
	//str2 = "fguy";
	//erase()函数删除单个元素,删除一个区间内的所有元素。时间复杂度均为o(n).
	
	//cin >> str >> str2;
	//str2.insert(str2.begin()+3,str.begin(),str.end());
	//cout << str2 << endl;
	
	cin >> str;
	//str.erase(str.begin()+2);
	//cout << str << endl;
	//删除一个区间内的所有元素[first, last) 
	//str.erase(str.begin()+2, str.end()-1);//迭代器法
	str.erase(3,2);//删除从第三个元素开始的两个字符;
	//clear()函数用以清空string中的数据,时间复杂度o(1)
	str.clear();
	//substr()函数substr(pos,len)返回从POS位置开始,长度为len的子串时间复杂度为o(len) 
	
	//cout << str.length() << endl; 
	//cout << str << endl;
 	str2 = "Thank you for your smile";
 	cout << str2.substr(0,5) << endl;
 	
	 
	return 0;
}

在这里主要说明find()函数和string::npos的使用;

int main(){
	//string str = "Thank you for your smile";
	//string str2 = "you";
	//string str3 = "me";
	//string::npos
 	//string::npos是一个常数,其本身的值为-1,但是由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值。
	//string::npos用以作为find函数失配时的返回值。主要结合find()函数来使用;
	//find(str2)函数返回其在str中第一次出现的位置如果不存在str2返回string::npos; 
	//find(str2, pos)从str的pos号位开始匹配str2,返回值与上相同 
	//if(str.find(str2) != string::npos){
	//	cout << str.find(str2) << endl;
	//}
	//if(str.find(str2,7) != string::npos){
	//	cout << str.find(str2, 7) << endl;
	//} 
	//replace()
	//replace(pos,len,str2)把str从pos位置开始。长度为len的子串替换为str2.
	//replace(it1,it2,str2)把str的迭代器[it1,it2)范围的子串替换为str2;时间复杂度为o(str.length()) 
	string str = "Maybe you will turn around";
	string str2= "will not";
	string str3 = "surely";
	cout << str.replace(10, 4, str2) << endl;
	cout << str.replace(str.begin(),str.begin()+5,str3) << endl;
	return 0; 
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值