C++ 提高3 STL基本概念 string 迭代器 容器

STL

基本概念

vector数组基本数据类型操作

vector数组复杂数据类型操作

vector数组指针数据类型操作

string

字符串的初始化:

string的 遍历之 for

string的 遍历之迭代器

string的 遍历 之 at()

string的 遍历 []

string的 遍历 [] 与 at()对比

string指针与string转换 : s1===>char *

string指针与string转换 : char *====>sting

string指针与string转换 : s1的内容copy buf中

string字符串的连接

string字符串的查找 find()返回第一次出现的位置

string查找字符串出现的次数:

string字符替换:replace()

string字符串的查找并替换

string单个字符的删除

string删除整个字符串

string字符串的头插法,尾插法

string字符串大小写转换

容器

vector容器

vector容器元素数量,尾部插入,头部元素,尾部元素,尾部元素删除

vector容器的初始化:

vector的遍历 通过数组的方式

vectorpush_back强化训练

vector区间删除:

vector删除指定位置的元素:

vector根据元素的值,删除元素

vector在首部,尾部插入元素:

迭代器,正向反向

deque双端数组容器:尾插,头插,遍历,首部弹出,尾部弹出

deque双端数组容器:查找元素所在容器的位置

stack容器:入栈,出栈,栈顶,栈大小

stack装入类

stack装入指针

queue队列:基本元素 push() front() size() pop()

queue队列:复杂类型

queue队列:指针类型

list的基本操作,元素的插入,遍历,不支持随机访问

list的删除,移除,

priority_queue优先级队列

set

set的基本操作insert,迭代器,erase

set的基本操作2:插入,遍历,删除

set对基本数据类型,能自动排序:

set2 集合从大到小

set复杂数据类型

自定义数据类型,仿函数排序法

如何判断 set1.insert函数的返回值

find查找  equal_range,返回结果是一个pair

set集合的查找:

multiset基本操练:

===================================================================

容器的基本数据操作

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

//STL 
#include <vector> 
#include <algorithm> 

int main()
{
	vector<int> v1;		//容器,把元素拷贝到容器
	v1.push_back(999);
	v1.push_back(1);
	v1.push_back(-55654);
	v1.push_back(999);
	//迭代器,相当于一个指针
	for(vector<int>::iterator i = v1.begin();i != v1.end();i++)
	{
		cout << *i << "  ";
	}
	cout << endl;

	//算法结合迭代器,找出从 v1.begin()到v1.end()有多少个999
	int n = count(v1.begin(),v1.end(),999);
	cout << n << endl;

	return 0;
}

[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
999  1  -55654  999  
2
[email protected]://990487026.blog.51cto.com~/c++$

容器里面装复杂数据类型

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

//STL 
#include <vector> 
#include <algorithm> 

class Teacher 
{
public:
	int age;
	char name[64];
	void printf()
	{
		cout << "age="<< age<<" name=" << name<<endl;
	}
};

int main()
{
	Teacher t1;	t1.age = 11;
	Teacher t2;	t2.age = 12;
	Teacher t3;	t3.age = 13;
	Teacher t4;	t4.age = 14;

	vector<Teacher> v1;		//容器,把元素拷贝到容器
	v1.push_back(t1);
	v1.push_back(t2);
	v1.push_back(t3);
	v1.push_back(t4);

	//迭代器,相当于一个指针
	for(vector<Teacher>::iterator i = v1.begin();i != v1.end();i++)
	{
		 cout << i->age << " ";
		 //cout << (*i).age << " ";
	}
	cout << endl;

	return 0;
}

[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
11 12 13 14 
[email protected]://990487026.blog.51cto.com~/c++$

把指针装入容器

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;

//STL 
#include <vector> 
#include <algorithm> 

class Teacher 
{
public:
	int age;
	char name[64];
	void printf()
	{
		cout << "age="<< age<<" name=" << name<<endl;
	}
};

int main()
{
	Teacher t1;	t1.age = 11;
	Teacher t2;	t2.age = 12;
	Teacher t3;	t3.age = 13;
	Teacher t4;	t4.age = 14;
	Teacher *p1 = &t1;
	Teacher *p2 = &t2;
	Teacher *p3 = &t3;
	Teacher *p4 = &t4;

	vector<Teacher*> v1;		//容器,把地址拷贝到容器
	v1.push_back(p1);
	v1.push_back(p2);
	v1.push_back(p3);
	v1.push_back(p4);

	//迭代器,相当于一个指针
	for(vector<Teacher*>::iterator i = v1.begin();i != v1.end();i++)
	{
		 cout << (*i)->age << " ";
		 //cout << (*i).age << " ";
	}
	cout << endl;
	return 0;
}

[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
11 12 13 14 
[email protected]://990487026.blog.51cto.com~/c++$

STL Srring

1 字符串的初始化:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "aaaa";
	string s2("bbbb");
	string s3 = s2; //通过拷贝构造函数 来初始化对象s3
	string s4(10, ‘a‘);

	cout << "s1=" << s1 << endl;
	cout << "s2=" << s2 << endl;
	cout << "s3=" << s3 << endl;
	cout << "s4=" << s4 << endl;
	return 0;
}

[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
s1=aaaa
s2=bbbb
s3=bbbb
s4=aaaaaaaaaa
[email protected]://990487026.blog.51cto.com~/c++$ 
================================================
string的 遍历1  []
[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "abcdefg";
	//1 数组方式
	for (int i=0; i<s1.length(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;
	return 0;
}

[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
a b c d e f g 
[email protected]://990487026.blog.51cto.com~/c++$

string的 遍历2 迭代器

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "abcdefg";
	//2 迭代器
	for (string::iterator it = s1.begin(); it != s1.end(); it++ )
	{
		cout << *it << " ";
	}
	cout << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
a b c d e f g 
[email protected]://990487026.blog.51cto.com~/c++$

string的 遍历2 at(),可以捕获异常

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "abcdefg";
	try
	{
		for (int i=0; i<s1.length() + 3; i++)
		{
			cout << s1.at(i) << " ";  //抛出异常
		}
	}
	catch ( ... )
	{
		cout << "发生异常\n" ;
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
a b c d e f g 发生异常
[email protected]://990487026.blog.51cto.com~/c++$

string的 遍历 [] 与 at()对比,[]不会捕获异常,VS环境下程序会中断,GCC下就不会

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "abcdefg";
	try
	{
		for (int i=0; i<s1.length() + 3; i++)
		{
			cout << s1[i] << " "; //出现错误 不向外面抛出异常 引起程序的中断
		}
		cout << endl;
	}
	catch ( ... )
	{
		cout << "发生异常\n" ;
	}

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
a b c d e f g    
[email protected]://990487026.blog.51cto.com~/c++$ 

GDB调试。程序是正常退出的
[Inferior 1 (process 1605) exited normally]
(gdb) quit

2 字符串,指针与string转换 : s1===>char *

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 
int main()
{
	string s1 = "aaabbbb";
	//1 s1===>char *
	const char *p =  s1.c_str() ;
	cout << p << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
aaabbbb
[email protected]://990487026.blog.51cto.com~/c++$

2 字符串,指针与string转换 : char *====>sting

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "aaabbbb";
	//1 s1===>char *
	const char *p =  s1.c_str() ;
	//2 char *====>sting 
	string s2 = p;
	cout << s2 << endl;;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
aaabbbb
[email protected]://990487026.blog.51cto.com~/c++$

2 字符串,指针与string转换 : s1的内容 copy buf中

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "aaabbbb";

	//3 s1的内容 copy buf中
	char buf1[128] = {0};
	s1.copy(buf1, 3, 0);  //注意 只给你copy3个字符 不会变成C风格的字符串
	cout << buf1 << endl; 

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
aaa
[email protected]://990487026.blog.51cto.com~/c++$

3  string 字符串的连接

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "aaa";
	string s2 = "bbb";
	s1 = s1 + s2;
	cout << s1 << endl;

	string s3 = "333";
	string s4 = "444";
	s3.append(s4);
	cout << s3 << endl;

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
aaabbb
333444
[email protected]://990487026.blog.51cto.com~/c++$

4 string 字符串的查找 find()返回第一次出现的位置

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "linux hello linux 111  linux 222  linux 333 ";
	int index = s1.find("hello", 0); //位置下标 从0开始
	cout << "index: " << index << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
index: 6
[email protected]://990487026.blog.51cto.com~/c++$

4 查找字符串出现的次数:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = " linux hello linux 111  linux 222  linux 333 ";
	int offindex = s1.find("linux", 0);
	while (offindex != string::npos)
	//这里的string::npos就是一个长度参数,表示直到字符串的结束
	{
		cout << "位置在 " << offindex << endl;
		offindex = offindex + 1;
		offindex = s1.find("linux", offindex); //wang bao ming 
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
位置在 1
位置在 13
位置在 24
位置在 35
[email protected]://990487026.blog.51cto.com~/c++$

4 string 字符替换:replace()

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <algorithm> 

int main()
{
	string s3 = "aaa  bbb ccc";
	s3.replace(0, 3, "AAA");
	cout << s3 << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
AAA  bbb ccc
[email protected]://990487026.blog.51cto.com~/c++$

4 string 字符串的查找并替换:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <string.h> 
#include <algorithm> 

int main()
{
	string s1 = " linux hello linux 111  linux 222  linux 333 ";
	int offindex = s1.find("linux", 0);
	while (offindex != string::npos)
	{
		cout << "位置" << offindex << endl;	//显示字符串找到的位置
		s1.replace(offindex,strlen("linux"), "China_linux");	//替换成你想要的字符串
		offindex = offindex + strlen("China_linux");		//位置偏移量,
		offindex = s1.find("linux", offindex); 			//继续找
	}
	cout << "s1替换后的结果: " << s1 << endl;

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
位置1
位置19
位置36
位置53
s1替换后的结果:  China_linux hello China_linux 111  China_linux 222  China_linux 333 
[email protected]://990487026.blog.51cto.com~/c++$

string 单个字符的删除

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <string.h> 
#include <algorithm> 

int main()
{
	string s1 = "hello1 hello2 hello1";
	string::iterator it = find(s1.begin(), s1.end(), ‘e‘);
	if (it != s1.end() )
	{
		s1.erase(it);
	}
	cout<< s1 << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
hllo1 hello2 hello1
[email protected]://990487026.blog.51cto.com~/c++$

4 string 删除整个字符串

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <string.h> 
#include <algorithm> 

int main()
{
	string s1 = "hello1 hello2 hello1";
	s1.erase(s1.begin(), s1.end() );
	cout << "s1全部删除:" << s1 << endl;
	cout << "s1长度 " << s1.length() << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
s1全部删除:
s1长度 0
[email protected]://990487026.blog.51cto.com~/c++$

4 string 字符串的头插法,尾插法

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <vector> 
#include <string> 
#include <string.h> 
#include <algorithm> 

int main()
{
	string s2 = "BBB";
	s2.insert(0, "AAA "); 		//头插法
	s2.insert(s2.length(), " CCC");	//尾插法
	cout << s2 << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
AAA BBB CCC
[email protected]://990487026.blog.51cto.com~/c++$

5 string字符串大小写转换

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
//STL 
#include <string> 
#include <algorithm> 

int main()
{
	string s1 = "AAAbbb";
	//1字符串开始,2字符串结束,3放到那里去,4 怎么放
	transform(s1.begin(), s1.end(),s1.begin(),::toupper);
	cout << s1 << endl;

	transform(s1.begin(), s1.end(), s1.begin(),::tolower);
	cout << s1 << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
AAABBB
aaabbb
[email protected]://990487026.blog.51cto.com~/c++$

容器

vector容器:

容器元素数量,尾部插入,头部元素,尾部元素,尾部元素删除

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

int main()
{
	vector<int> v1;
	cout << "length:" << v1.size() <<endl;	//显示容器里面的数目
	v1.push_back(1);			//在尾部插入int元素 1
	v1.push_back(3);
	v1.push_back(5);
	cout << "length:" << v1.size() <<endl;
	cout << "头部元素是" << v1.front() << endl;//front()是头部元素

	v1.front() = 11;	//修改 头部元素 函数返回值当左值 应该返回一个引用
	v1.back() = 99;		//修改 尾部元素 函数返回值当左值 应该返回一个引用

	while (v1.size() > 0)	//遍历容器
	{
		cout <<"尾部元素是" << v1.back() << endl; ; //获取尾部元素
		v1.pop_back();			 //删除尾部元素
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
length:0
length:3
头部元素是1
尾部元素是99
尾部元素是3
尾部元素是11
[email protected]://990487026.blog.51cto.com~/c++$

vector容器的初始化:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);

	vector<int> v2 = v1;  //对象初始化
	vector<int> v3(v1.begin()+1, v1.begin()+3 );	//初始化来自地址
	printV(v3);
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
3 5 
[email protected]://990487026.blog.51cto.com~/c++$

vector的遍历 通过数组的方式

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

int main()
{
	vector<int> v1(10);   //提前把10个内存空间准备好
	for (int i=0; i<10; i++)
	{
		v1[i] = i * i;
	}

 	for (int i=0; i<10; i++)
 	{
 		cout << v1[i] << " ";
 	}
	cout << endl;

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
0 1 4 9 16 25 36 49 64 81 
[email protected]://990487026.blog.51cto.com~/c++$

vector push_back强化训练

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> v1(10);   //提前把内存准备好
	v1.push_back(100);
	v1.push_back(200);
	cout << "size: " << v1.size() << endl;
	printV(v1);
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
size: 12
0 0 0 0 0 0 0 0 0 0 100 200 
[email protected]://990487026.blog.51cto.com~/c++$

迭代器,正向 反向

//1迭代器 end()的理解 
//   1	3	5
//	 ▲
//	          ▲
//当 it == v1.end()的时候 说明这个容器已经遍历完毕了...
//end()的位置 应该是 5的后面

//2 迭代器的种类
/*
typedef iterator pointer;
typedef const_iterator const_pointer;
typedef _STD reverse_iterator<iterator> reverse_iterator;
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
*/
[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

int main()
{
	vector<int> v1(10);   
	for (int i=0; i<10; i++)
	{
		v1[i] = i + 1;
	}

	//正向遍历
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it ++ )
	{
		cout << *it << " ";
	}
	cout << endl;

	//逆序遍历
	for (vector<int>::reverse_iterator rit = v1.rbegin(); rit!=v1.rend(); rit++ )
	{
		cout << *rit << " ";
	}
	cout << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1 2 3 4 5 6 7 8 9 10 
10 9 8 7 6 5 4 3 2 1 
[email protected]://990487026.blog.51cto.com~/c++$

vector区间删除:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> v1(10);   
	for (int i=0; i<10; i++)
	{
		v1[i] = i + 1;
	}
	printV(v1);
	v1.erase(v1.begin(), v1.begin()+3);	//区间删除
	printV(v1);
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1 2 3 4 5 6 7 8 9 10 
4 5 6 7 8 9 10 
[email protected]://990487026.blog.51cto.com~/c++$ 
[email protected]://990487026.blog.51cto.com~/c++$

vector 删除指定位置的元素:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> v1(10);   
	for (int i=0; i<10; i++)
	{
		v1[i] = i + 1;
	}
	printV(v1);
	//根据元素的位置 指定位置删除
	v1.erase(v1.begin()); //在头部删除一个元素
	printV(v1);
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1 2 3 4 5 6 7 8 9 10 
2 3 4 5 6 7 8 9 10 
[email protected]://990487026.blog.51cto.com~/c++$

vector 根据元素的值,删除元素

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> v1(10);   
	for (int i=0; i<10; i++)
	{
		v1[i] = i + 1;
	}
	//根据元素的值 
	v1[1] = 2;
	v1[3] = 2;
	printV(v1);

	for (vector<int>::iterator it =v1.begin(); it != v1.end();)
	{
		if (*it == 2)
		{
			it = v1.erase(it);  //当 删除迭代器所指向的元素的时候,erase删除函数会让it自动下移动
		}
		else
		{
			it ++;
		}
	}
	printV(v1);
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1 2 3 2 5 6 7 8 9 10 
1 3 5 6 7 8 9 10 
[email protected]://990487026.blog.51cto.com~/c++$

vector 在首部,尾部插入元素:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <vector> 

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> v1(10);   
	v1.insert(v1.begin(), 100);
	v1.insert(v1.end(), 200);
	printV(v1);
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
100 0 0 0 0 0 0 0 0 0 0 200 
[email protected]://990487026.blog.51cto.com~/c++$

deque 双端数组容器:尾插,头插,遍历,首部弹出,尾部弹出

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <deque> 

void printD(deque<int> &d)
{
	for (deque<int>::iterator it=d.begin(); it!=d.end(); it++ )
	{
		cout << *it << " ";
	}
	cout << endl;
}

int main()
{
	deque<int> d1;
	d1.push_back(1);
	d1.push_back(3);
	d1.push_back(5);

	d1.push_front(-11);
	d1.push_front(-33);
	d1.push_front(-55);

	printD(d1);
	cout << "头部元素:" << d1.front() <<endl;
	cout << "尾部元素:" << d1.back() << endl;

	d1.pop_front();
	d1.pop_back();
	printD(d1);
	cout <<endl;

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
-55 -33 -11 1 3 5 
头部元素:-55
尾部元素:5
-33 -11 1 3 
[email protected]://990487026.blog.51cto.com~/c++$

deque 双端数组容器:查找元素所在容器的位置

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <deque> 
#include <algorithm> 

void printD(deque<int> &d)
{
	for (deque<int>::iterator it=d.begin(); it!=d.end(); it++ )
	{
		cout << *it << " ";
	}
	cout << endl;
}

int main()
{
	deque<int> d1;
	d1.push_back(1);
	d1.push_back(3);
	d1.push_back(5);

	d1.push_front(-11);
	d1.push_front(-33);
	d1.push_front(-55);

	printD(d1);
	//查找 -33 在数组下标的值
	deque<int>::iterator it =  find(d1.begin(), d1.end(), -33 );
	if (it != d1.end())
	{
		cout << "-33数组下标是" << distance(d1.begin(), it) <<endl;
	}
	else
	{
		cout << "没有找到值为-33的元素" << endl;
	}

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
-55 -33 -11 1 3 5 
-33数组下标是1
[email protected]://990487026.blog.51cto.com~/c++$

stack容器:入栈,出栈,栈顶,栈大小

[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
栈的大小是 10
81 64 49 36 25 16 9 4 1 0 
栈的大小是 0
[email protected]://990487026.blog.51cto.com~/c++$ 
[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <stack> 

int main()
{
	stack<int> s;

	//入栈
	for (int i=0; i<10; i++)
	{
		s.push(i * i);	//把元素压入 stack容器
	}
	cout << "栈的大小是 " << s.size() << endl;

	//出栈
	while (!s.empty())
	{
		int tmp = s.top(); 	//获取栈顶元素
		cout <<  tmp << " ";
		s.pop(); //弹出栈顶元素 
	}
	cout << endl;
	cout << "栈的大小是 " << s.size() << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
栈的大小是 10
81 64 49 36 25 16 9 4 1 0 
栈的大小是 0
[email protected]://990487026.blog.51cto.com~/c++$

stack装入复杂数据

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <stack> 
class Teacher
{
public:
	int		age;
	char	name[32];
public:
	void printT()
	{
		cout << "age:" << age << endl;
	}

};

int main()
{
	Teacher t1, t2, t3;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;

	stack<Teacher> s;
	s.push(t1);
	s.push(t2);
	s.push(t3);

	while (!s.empty())
	{
		Teacher tmp = s.top();
		tmp.printT();
		s.pop();
	}

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
age:33
age:32
age:31
[email protected]://990487026.blog.51cto.com~/c++$

stack装入指针

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <stack> 
class Teacher
{
public:
	int		age;
	char	name[32];
public:
	void printT()
	{
		cout << "age:" << age << endl;
	}

};

int main()
{
	Teacher t1, t2, t3;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;
	stack<Teacher *> s;
	s.push(&t1);
	s.push(&t2);
	s.push(&t3);

	while ( !s.empty())
	{
		Teacher *p = s.top();
		p->printT();
		s.pop();
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
age:33
age:32
age:31
[email protected]://990487026.blog.51cto.com~/c++$

queue队列:基本元素 push() front() size() pop()

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <queue> 

int main()
{
	queue<int>  q;
	q.push(1);
	q.push(2);
	q.push(3);

	cout << "队头元素:" << q.front() << endl;
	cout << "队列的大小" << q.size() <<endl;
	while ( !q.empty())
	{
		int tmp = q.front();
		cout << tmp << " ";
		q.pop();
	}
	cout << endl;

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
队头元素:1
队列的大小3
1 2 3 
[email protected]://990487026.blog.51cto.com~/c++$

queue队列:复杂类型

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <queue> 
class Teacher
{
public:
	int		age;
	char	name[32];
public:
	void printT()
	{
		cout << "age:" << age << endl;
	}

};

int main()
{
	Teacher t1, t2, t3;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;
	queue<Teacher> q;
	q.push(t1);
	q.push(t2);
	q.push(t3);

	while (!q.empty())
	{
		Teacher tmp = q.front();
		tmp.printT();
		q.pop();
	}

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
age:31
age:32
age:33
[email protected]://990487026.blog.51cto.com~/c++$

queue队列:指针类型

[email protected]://990487026.blog.51cto.com~/c++$ 
[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <queue> 
class Teacher
{
public:
	int	age;
	char	name[32];
public:
	void printT()
	{
		cout << "age:" << age << endl;
	}

};

int main()
{
	Teacher t1, t2, t3;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;
	queue<Teacher *> q;
	q.push(&t1);
	q.push(&t2);
	q.push(&t3);

	while (!q.empty())
	{
		Teacher *tmp = q.front();
		tmp->printT();
		q.pop();
	}

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
age:31
age:32
age:33
[email protected]://990487026.blog.51cto.com~/c++$

list的基本操作,元素的插入,遍历,不支持随机访问

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <list> 

int main()
{

	list<int> l;
	cout <<  "list的大小:" << l.size() << endl;
	for (int i=0; i<10; i++)
	{
		l.push_back(i); //尾部插入元素 尾插法
	}
	cout <<  "list的大小:" << l.size() << endl;

	list<int>::iterator it = l.begin();
	while (it != l.end())
	{
		cout << *it << " ";
		it ++;
	}
	cout << endl;

	//list不能随机访问
	//0	 1	2	3	4	5
	//              ▲
	it = l.begin();
	it ++;
	it ++ ;
	it ++ ;
	//it = it + 5;  //不支持随机的访问容器
	l.insert(it, 100); //请问100插入什么位置
	for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
	{
		cout << *it <<" ";
	}
	cout << endl;

	//结论1 链表的结点index 序号是从0号位置开始
	//		在3号位置插入元素, 让原来的3号位置变成4号位置  原来的4号位置变成5号位置

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
list的大小:0
list的大小:10
0 1 2 3 4 5 6 7 8 9 
0 1 2 100 3 4 5 6 7 8 9 
[email protected]://990487026.blog.51cto.com~/c++$

list的删除,移除,

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <list> 

int main()
{
	list<int> l;
	cout <<  "list的大小:" << l.size() << endl;
	for (int i=0; i<10; i++)
	{
		l.push_back(i); //尾部插入元素 尾插法
	}
	cout <<  "list的大小:" << l.size() << endl;

	for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
	{
		cout << *it <<" ";
	}
	cout << endl;

	//0	 1	2	3	4	5
	//          ▲
	list<int>::iterator it1 = l.begin();
	list<int>::iterator it2 = l.begin();
	it2 ++ ;
	it2 ++ ;
	it2 ++ ;

	l.erase(it1, it2);

	for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
	{
		cout << *it <<" ";
	}
	cout << endl;

	l.insert(l.begin(), 100);
	l.insert(l.begin(), 100);
	l.insert(l.begin(), 100);

	l.erase(l.begin()); //
	l.remove(100); //2
	for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
	{
		cout << *it <<" ";
	}
	cout << endl;

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
list的大小:0
list的大小:10
0 1 2 3 4 5 6 7 8 9 
3 4 5 6 7 8 9 
3 4 5 6 7 8 9 
[email protected]://990487026.blog.51cto.com~/c++$

优先级队列 priority_queue

[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
队头元素:55
队列的大小:4
55 33 22 11 测试 最小值优先级队列 
最小值优先级队列 队头元素:11
最小值优先级队列 队列的大小:4
11 22 33 55 
[email protected]://990487026.blog.51cto.com~/c++$ 
[email protected]://990487026.blog.51cto.com~/c++$ 
[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <queue> 

int main()
{

	priority_queue<int> p1 ; //默认情况下 是 最大值优先级队列 
	priority_queue<int , vector<int>, less<int> > p2; //提前定义好的预定义函数  谓词
	priority_queue<int , vector<int>, greater<int> >  p3; //最小值优先级队列

	p1.push(33);
	p1.push(11);
	p1.push(55);
	p1.push(22);

	cout << "队头元素:" << p1.top() <<endl;
	cout << "队列的大小:" << p1.size() << endl;

	while (p1.size() > 0 )
	{
		cout << p1.top() << " ";
		p1.pop();
	}

	cout << "测试 最小值优先级队列 " << endl;

	p3.push(33);
	p3.push(11);
	p3.push(55);
	p3.push(22);

	cout << "最小值优先级队列 队头元素:" << p3.top() <<endl;
	cout << "最小值优先级队列 队列的大小:" << p3.size() << endl;

	while (p3.size() > 0 )
	{
		cout << p3.top() << " ";
		p3.pop();
	}
	cout << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
队头元素:55
队列的大小:4
55 33 22 11 测试 最小值优先级队列 
最小值优先级队列 队头元素:11
最小值优先级队列 队列的大小:4
11 22 33 55 
[email protected]://990487026.blog.51cto.com~/c++$

set的基本操作insert,迭代器,erase

1 集合 有序(默认从小到大) 唯一 (红黑二叉树 这种数据结构的变体)

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
using namespace std;
#include <set> 

int main()
{
	set<int> set1;
	for (int i=0; i<5; i++)
	{
		int tmp = rand();
		set1.insert(tmp);
	}
	set1.insert(100);
	set1.insert(100);
	set1.insert(100);

	//打印输出
	for (set<int>::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout<< *it << " ";
	}
	cout << endl;

	//删除集合
	cout << "删除集合\n";
	while (!set1.empty())
	{
		set<int>::iterator it = set1.begin();
		cout << *it << " ";
		set1.erase(set1.begin());
	}
	cout << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
100 846930886 1681692777 1714636915 1804289383 1957747793 
删除集合
100 846930886 1681692777 1714636915 1804289383 1957747793 
[email protected]://990487026.blog.51cto.com~/c++$

set的基本操作2:插入,遍历,删除

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#include <set> 

int main()
{
	set<int>  set1;

	for (int i=0; i<5; i++)
	{
		int tmp = rand();
		set1.insert(tmp);
	}
	//插入元素 重复的
	set1.insert(100);
	set1.insert(100);
	set1.insert(100);

	for (set<int>::iterator it=set1.begin(); it!=set1.end(); it++ )
	{
		cout << *it << " ";
	}
	cout << endl;

	//删除集合 
	while ( !set1.empty())
	{
		set<int>::iterator it = set1.begin();
		cout << *it << " ";
		set1.erase(set1.begin());
	}
	cout << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
100 846930886 1681692777 1714636915 1804289383 1957747793 
100 846930886 1681692777 1714636915 1804289383 1957747793 
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run

set对基本数据类型,能自动排序:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
using namespace std;
#include <set> 

int main()
{
	set<int> set1;  
	set<int, less<int> > set2;   //默认情况下是这样 

	set<int, greater<int> > set3;  //从大 到 小

	for (int i=0; i<5; i++)
	{
		int tmp = rand();
		set3.insert(tmp);
	}

	//从大 到 小
	for (set<int, greater<int> >::iterator it = set3.begin(); it != set3.end(); it++  )
	{
		cout << *it << endl;
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1957747793
1804289383
1714636915
1681692777
846930886
[email protected]://990487026.blog.51cto.com~/c++$

set 2 集合 从大到小

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#include <set> 

int main()
{
	set<int, greater<int> > set1;
	for (int i=0; i<5; i++)
	{
		int tmp = rand();
		set1.insert(tmp);
	}
	set1.insert(100);
	set1.insert(100);
	set1.insert(100);

	//打印输出
	for (set<int, greater<int> >::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout<< *it << " ";
	}
	cout << endl;

	//删除集合
	cout << "删除集合\n";
	while (!set1.empty())
	{
		set<int, greater<int> >::iterator it = set1.begin();
		printf("%d ", *it);
		set1.erase(set1.begin());
	}
	cout << endl;

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1957747793 1804289383 1714636915 1681692777 846930886 100 
删除集合
1957747793 1804289383 1714636915 1681692777 846930886 100 
[email protected]://990487026.blog.51cto.com~/c++$

set 复杂数据类型

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#include <set> 

//3 自定义数据类型 排序
//03 仿函数 函数对象 重载() 操作 进行比较大小
//题目:学生包含学号,姓名属性,现要求任意插入几个学生对象到set容器中,
//使得容器中的学生按学号的升序排序
class Student
{
public:
	Student(const char *name, int age)
	{
		strcpy(this->name, name);
		this->age = age;
	}
protected:
public:
	char name[64];
	int age ;
};

//函数对象
struct StuFunctor
{
	bool operator()(const Student &left, const Student &right)
	{
		return (left.age < right.age); 
	}
};

int main()
{

	set<Student, StuFunctor> set1;
	Student s1("张1", 32);

	set1.insert(s1);
	set1.insert(Student("张2", 32) );
	set1.insert(Student("张3", 53) );
	set1.insert(Student("张4", 34) );

	//打印输出
	for (set<Student, StuFunctor >::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout<< (*it).name << " ";
	}
	cout << endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
张1 张4 张3 
[email protected]://990487026.blog.51cto.com~/c++$

自定义数据类型,仿函数排序法

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include <set> 

class Student
{
public:
	Student(const char *name, int age)
	{
		strcpy(this->name, name);
		this->age = age;
	}
public:
	char name[64];
	int		age;
};

//仿函数 
struct FuncStudent
{
	bool operator()(const Student &left, const Student &right)
	{
		if (left.age < right.age)  //如果左边的小 就返回真 从小到大按照年龄进行排序
		{
			return true;
		}
		else
		{
			return false; 
		}
	}
};

int main()
{
	Student s1("s1", 31);
	Student s2("s2", 22);
	Student s3("s3", 44);
	Student s4("s4", 11);
	Student s5("s5", 31);

	set<Student, FuncStudent> set1;
	set1.insert(s1);
	set1.insert(s2);
	set1.insert(s3);
	set1.insert(s4);
	set1.insert(s5); //如果两个31岁 能插入成功  
	//如何知道 插入 的结果

	//遍历
	for (set<Student, FuncStudent>::iterator it=set1.begin(); it!=set1.end(); it++ )
	{
		cout << it->age << "\t" <<  it->name << endl;
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
11	s4
22	s2
31	s1
44	s3
[email protected]://990487026.blog.51cto.com~/c++$

如何判断 set1.insert函数的返回值

//typedef pair<iterator, bool> _Pairib;
//4 如何判断 set1.insert函数的返回值
//Pair的用法 
[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include <set> 

class Student
{
public:
	Student(const char *name, int age)
	{
		strcpy(this->name, name);
		this->age = age;
	}
public:
	char name[64];
	int		age;
};

//仿函数 
struct FuncStudent
{
	bool operator()(const Student &left, const Student &right)
	{
		if (left.age < right.age)  //如果左边的小 就返回真 从小到大按照年龄进行排序
		{
			return true;
		}
		else
		{
			return false; 
		}
	}
};

int main()
{
	Student s1("s1", 31);
	Student s2("s2", 22);
	Student s3("s3", 44);
	Student s4("s4", 11);
	Student s5("s5", 31);

	set<Student, FuncStudent> set1;
	pair<set<Student, FuncStudent>::iterator, bool> pair1 = set1.insert(s1);
	if (pair1.second == true)
	{
		cout << "插入s1成功" << endl;
	}
	else
	{
		cout << "插入s1失败" << endl;
	}

	set1.insert(s2);

	//如何知道 插入 的结果
	pair<set<Student, FuncStudent>::iterator, bool> pair5 = set1.insert(s5); //如果两个31岁 能插入成功  
	if (pair5.second == true)
	{
		cout << "插入s1成功" << endl;
	}
	else
	{
		cout << "插入s1失败" << endl;
	}

	//遍历
	for (set<Student, FuncStudent>::iterator it=set1.begin(); it!=set1.end(); it++ )
	{
		cout << it->age << "\t" <<  it->name << endl;
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
插入s1成功
插入s1失败
22	s2
31	s1
[email protected]://990487026.blog.51cto.com~/c++$

find查找  equal_range  返回结果是一个pair

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
#include <set> 

int main()
{

	set<int> set1;  

	for (int i=0; i<10; i++)
	{
		set1.insert(i+1);
	}

	//从大 到 小
	for (set<int>::iterator it = set1.begin(); it != set1.end(); it++  )
	{
		cout << *it << " ";
	}
	cout << endl;

	set<int>::iterator it0 =  set1.find(5);
	cout << "it0:" << *it0 << endl;

	int num1 = set1.count(5);
	cout << "num1:" << num1 << endl;

	set<int>::iterator it1 =   set1.lower_bound(5); // 大于等于5的元素 的 迭代器的位置
	cout << "it1:" << *it1 << endl;

	set<int>::iterator it2 =   set1.lower_bound(5); // 大于5的元素 的 迭代器的位置
	cout << "it2:" << *it2 << endl;

	//typedef pair<iterator, bool> _Pairib;
	//typedef pair<iterator, iterator> _Pairii;
	//typedef pair<const_iterator, const_iterator> _Paircc;
	//把5元素删除掉
	set1.erase(5); 
	pair<set<int>::iterator, set<int>::iterator>  mypair = set1.equal_range(5);
	set<int>::iterator it3 = mypair.first;
	cout << "it3:" << *it3 << endl;  //5  //6

	set<int>::iterator it4 =  mypair.second; 
	cout << "it4:" << *it4 << endl;  //6  //6

	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1 2 3 4 5 6 7 8 9 10 
it0:5
num1:1
it1:5
it2:5
it3:6
it4:6
[email protected]://990487026.blog.51cto.com~/c++$

set集合的查找:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#include <set> 

//3 自定义数据类型 排序
//03 仿函数 函数对象 重载() 操作 进行比较大小
//题目:学生包含学号,姓名属性,现要求任意插入几个学生对象到set容器中,
//使得容器中的学生按学号的升序排序
class Student
{
public:
	Student(const char *name, int age)
	{
		strcpy(this->name, name);
		this->age = age;
	}
protected:
public:
	char name[64];
	int age ;
};

//函数对象
struct StuFunctor
{
	bool operator()(const Student &left, const Student &right)
	{
		return (left.age < right.age); 
	}
};

int main()
{
	int		i = 0;
	set<int> set1;

	for (i=1; i<10; i++)
	{
		set1.insert(i);
	}
	//打印输出
	for (set<int>::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout<< *it << " ";
	}
	cout << endl;

	set<int>::iterator it1 =  set1.lower_bound(5); //大于等于5迭代器
	set<int>::iterator it2 =  set1.upper_bound(5); //大于5的迭代器

	//通过迭代器进行元素的操作
	cout<<"it1 "<<*it1<<" "<<"it2 "<<*it2<<endl;

	pair <set<int>::iterator, set<int>::iterator> pairIt = set1.equal_range(5);
	set<int>::iterator it3 = pairIt.first; //获取第一个
	set<int>::iterator it4 = pairIt.second; //获取第二个
	cout<<"it3 "<<*it3<<" "<<"it4 "<<*it4<<endl;
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
1 2 3 4 5 6 7 8 9 
it1 5 it2 6
it3 5 it4 6
[email protected]://990487026.blog.51cto.com~/c++$

multiset基本操练:

[email protected]://990487026.blog.51cto.com~/c++$ cat main.cpp 
#include <iostream>
#include <stdio.h>
using namespace std;
#include <set> 

int main()
{

	multiset<int> set1;
	int tmp = 0;

	printf("请输入multiset集合的值:");
	scanf("%d", &tmp);
	while (tmp != 0)
	{
		set1.insert(tmp);
		printf("请输入multiset集合的值:");
		scanf("%d", &tmp);
	}

	//遍历
	for (multiset<int>::iterator it=set1.begin(); it!=set1.end(); it++ )
	{
		cout << *it << " ";
	}
	cout << endl;

	while (!set1.empty())
	{
		multiset<int>::iterator it = set1.begin();
		cout << *it << " ";
		set1.erase(it);
	}
	return 0;
}
[email protected]://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
请输入multiset集合的值:4
请输入multiset集合的值:5
请输入multiset集合的值:7
请输入multiset集合的值:83
请输入multiset集合的值:54
请输入multiset集合的值:6
请输入multiset集合的值:4
请输入multiset集合的值:4
请输入multiset集合的值:4
请输入multiset集合的值:0
4 4 4 4 5 6 7 54 83 
4 4 4 4 5 6 7 54 83 [email protected]://990487026.blog.51cto.com~/c++$ 
=====================================
时间: 2024-10-12 13:55:30

C++ 提高3 STL基本概念 string 迭代器 容器的相关文章

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

STL 基本概念

STL 基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现在是一个C++软件库,也是C++标准程序库的一部分,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),几乎所有的代码都采 用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会.在C++标准中,STL被组织为下面的1

[经典面试题][百度]c++实现STL中的string类

题目 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能. 代码 /*------------------------------------- * 日期:2015-03-31 * 作者:SJF0115 * 题目: 实现string类 * 来源:百度 * 博客: ------------------------------------*/ #include <iostream> #include <cstring> us

STL || HDU 1894 String Compare

如果一个词包含再另一个词的前面(前缀),是一对前缀,求一共有多少对 *解法:STL万岁 #include<string>:https://www.cnblogs.com/SZxiaochun/p/6699450.html #include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; #define SZ 50010

STL 里面的几个容器简叙

出处:http://blog.csdn.net/niushuai666/article/details/6654951 list1.list的成员函数push_back()把一个对象放到一个list的后面,而 push_front()把对象放到前面2.list容器不支持在iterator加一个数来指向隔一个的对象. 就是说,我们不能用Milkshakes.begin()+2来指向list中的第三个对象,因为STL的list是以双链的list来实现的, 它不支持随机存取.vector和deque(

STL中map与hash_map容器的选择

[转]STL中map与hash_map容器的选择 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的.做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了.今天改进代码,顺便又来温习基础功课了. 还记得Herb Sutter那极有味道的<C++对话系列>么,在其中<产生真正的hash对象>这个故事里就讲了map的选择.顺便回顾一下,也讲一下我在实用中

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

STL 笔记(三) 容器适配器 stack、queue、priority_queue

栈 stack 栈 stack 是一种先进后出的(First In Last Out, FILO)的数据结构.在 STL中,stack 底层容器默认使用的是deque, 也可以自己指定用 vector 或 list 容器,然后将其接口适配为栈的接口.部分源代码: // stack source code (部分) template <class _Tp, class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(deque<_Tp>) > class

STL源码分析--迭代器总结、迭代器失效总结

Vector 1.内部数据结构:连续存储,例如数组. 2.随机访问每个元素,所需要的时间为常量. 3.在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化. 4.可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存. 5.迭代器失效 插入:vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同).当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有