目录
3 STL-常用容器
string容器
189 构造函数
string s1;//创建一个空的字符串 默认构造
const char *str = "hello";
string s2(str);//使用字符串S初始化
cout << "s2=" << s2 << endl; //s2 = hello
string s3(s2);//使用一个string对象初始化另一个string对象
cout << "s3=" << s3 << endl; //s3 = hello
string s4(10, 'a');//使用n个字符c初始化
cout << "s4=" << s4 << endl; //s4 = aaaaaaaaaa
190 赋值操作
string str1;
str1 = "hello";
cout << "str1=" << str1 << endl;//str1=hello
string str2;
str2 = str1;
cout << "str2=" << str2 << endl;//str1=hello
string str3;
str3 = 'a';
cout << "str3=" << str3 << endl;//str3=a
string str4;
str4.assign("assign方式");
cout << "str4=" << str4 << endl;//str4=assign方式
string str5;
str5.assign("hello sfa", 7);
cout << "str5=" << str5 << endl;//str5=hello s
string str6;
str6.assign(str5);
cout << "str6=" << str6 << endl;//str6=hello s
string str7;
str7.assign(10, 's');
cout << "str7=" << str7 << endl;//str7=ssssssssss
191 字符串拼接
string str1;
str1 = "hello";
str1 += " world";
cout << "str1=" << str1 << endl;//str1=hello world
str1 += '!';
cout << "str1=" << str1 << endl;//str1=hello world!
string str2 = "0123456";
str1 += str2;
cout << "str1=" << str1 << endl;//str1=hello world!0123456
str1.append("append方式");
cout << "str1=" << str1 << endl;//str1=hello world!0123456append方式
str1.append("aaaa", 3);
cout << "str1=" << str1 << endl;//str1=hello world!0123456append方式aaa
str1.append(str2);
cout << "str1=" << str1 << endl;//str1=hello world!0123456append方式aaa0123456
str1.append(str2,3,2);//参数2 从哪个字符开始截取,参数3 截取字符个数
cout << "str1=" << str1 << endl;//str1=hello world!0123456append方式aaa012345634
192 字符串查找和替换
void test01()
{//查找
string str1 = "abcdefg";
int pos=str1.find("de");
cout << "pos=" << pos << endl;//pos=3
pos = str1.find("deg");
cout << "pos=" << pos << endl;//pos=-1
if (pos!=-1)
{
cout << "找到字符串" << endl;
cout << "位置为:" << pos << endl;
}
else
{
cout << "未找到字符串" << endl;
}
//rfind从右往左查找;find从左往右查找
string str2 = "adsajka";
pos = str2.rfind('a');
cout << "pos=" << pos << endl;//pos=6
pos = str2.find('a');
cout << "pos=" << pos << endl;//pos=0
}
void test02()
{//替换
string str1 = "sahdkfsa";
str1.replace(1,2, "1111");//从1号位置起,2个字符替换为1111
cout << "str1=" << str1 << endl;//str1=s1111dkfsa
}
193 字符串比较
string str1 = "hellob";
string str2 = "helloa";
if (str1.compare(str2) == 0)
{
cout << "str1==str2" << endl;
}
else if(str1.compare(str2) > 0)
{
cout << "str1>str2" << endl;
}
else
{
cout << "str1<str2" << endl;
}
194 字符存取
string str = "hello";
//通过[]访问单个字符
for (int i = 0; i < str.size(); i++)
{
cout << str[i]<<" ";//h e l l o
}
cout << endl;
//通过at访问单个字符
for (int i = 0; i < str.size(); i++)
{
cout << str.at(i) << " ";//h e l l o
}
cout << endl;
//修改单个字符
str[0] = 'g';
cout << "str=" << str << endl;//str=gello
str.at(3) = 'g';
cout << "str=" << str << endl;//str=gelgo
195 字符串插入和删除
string str = "hello";
//插入
str.insert(1, "555");//从第1个位置,插入"111"
cout << "str=" << str << endl;//str=h555ello
//删除
str.erase(1, 3);//从第1个位置,删除3个元素
cout << "str=" << str << endl;//str=h555ello
196 子串获取
string str = "abcdefg";
string substr = str.substr(2,3);
cout << "str=" << str << endl;//str=abcdefg
cout << "substr=" << substr << endl;//substr=cde
string email = "skyesun@cool.com";
int pos = email.find("@");
cout << pos << endl;//7
string username = email.substr(0, pos);
cout << username << endl;//skyesun
vector容器
197 构造函数
//默认构造 无参构造
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1); //0 1 2 3 4 5 6 7 8 9
//通过区间方式进行构造
vector<int>v2(v1.begin(), v1.end());
printVector(v2); //0 1 2 3 4 5 6 7 8 9
//n个elem方式构造
vector<int>v3(10, 100);
printVector(v3); //100 100 100 100 100 100 100 100 100 100
//拷贝构造
vector<int>v4(v3);
printVector(v4); //100 100 100 100 100 100 100 100 100 100
198 赋值操作
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1); //0 1 2 3 4 5 6 7 8 9
//赋值 operator=
vector<int>v2;
v2 = v1;
printVector(v2);//0 1 2 3 4 5 6 7 8 9
//赋值 assign
vector<int>v3;
v3.assign(v1.begin(), v1.end());
printVector(v3);//0 1 2 3 4 5 6 7 8 9
//赋值 n个elem方式
vector<int>v4;
v4.assign(10, 100);
printVector(v4);//100 100 100 100 100 100 100 100 100 100
199 容量和大小
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
if (v1.empty())
{
cout << "v1为空" << endl;
}
else
{
cout << "v1不为空" << endl; //v1不为空
cout << "v1的容量为:" << v1.capacity() << endl;//v1的容量为:13
cout << "v1的大小为:" << v1.size() << endl;// v1的大小为:10
}
//重新指定大小
v1.resize(15);//如果指定的比原来的长,默认使用0重新填充新位置
printVector(v1);// 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
v1.resize(20,100); //可用参数2指定默认填充值
printVector(v1);// 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 100 100 100 100 100
v1.resize(5);
printVector(v1);//0 1 2 3 4
200 插入和删除
printVector(v1);//0 1 2 3 4
//尾删
v1.pop_back();
printVector(v1);//0 1 2 3
//插入 第一个参数是迭代器
v1.insert(v1.begin(), 100);//100 0 1 2 3
printVector(v1);
v1.insert(v1.begin(), 2, 1000);//1000 1000 100 0 1 2 3
printVector(v1);
//删除
v1.erase(v1.begin());
printVector(v1);//1000 100 0 1 2 3
v1.erase(v1.begin(),v1.end());
printVector(v1);//
//清空
v1.clear();
printVector(v1);//
201 数据存取
vector<int>v1;
for (int i = 0; i < 5; i++)
{
v1.push_back(i);
}
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] <<" ";
}
cout << endl;
for (int i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << " ";
}
cout << endl;
cout << "第一个元素为:" << v1.front() << endl;
cout << "最后一个元素为:" << v1.back() << endl;
//0 1 2 3 4
//0 1 2 3 4
//第一个元素为:0
//最后一个元素为:4
202 互换容器
//巧用swap可以收缩内存
vector<int>v;
for (int i = 0; i < 10000; i++)
{
v.push_back(i);
}
cout << "v容量:" << v.capacity() << endl;//v容量:12138
cout << "v大小:" << v.size() << endl;//v大小:10000
v.resize(3);
cout << "v容量:" << v.capacity() << endl;//v容量:12138
cout << "v大小:" << v.size() << endl;//v大小:3
//swap可以收缩内存
vector<int>(v).swap(v);
cout << "v容量:" << v.capacity() << endl;//v容量:3
cout << "v大小:" << v.size() << endl;// v大小:3
//vector<int>(v)匿名对象
//(用拷贝构造函数创造了一个新的对象,会用目前v的元素个数来初始化匿名对象大小)
203 预留空间
vector<int>v;
//利用reserve预留空间
v.reserve(10000);
int num = 0;//统计开辟内存的次数
int* p = NULL;
for (int i = 0; i < 10000; i++)
{
v.push_back(i);
if (p != &v[0])
{
p = &v[0];
num++;
}
}
cout << num << endl;//24 用了reserve后变为1
deque容器
204 构造函数
void printDeque(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
deque<int>d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
printDeque(d1);
deque<int>d2(d1.begin(), d1.end());
printDeque(d2);
deque<int>d3(10,200);
printDeque(d3);
deque<int>d4(d3);
printDeque(d4);
}
205 赋值操作
deque<int>d1;
for (int i = 0; i < 6; i++)
{
d1.push_back(i);
}
printDeque(d1);
deque<int>d2;
d2 = d1;
printDeque(d2);
deque<int>d3;
d3.assign(d1.begin(), d1.end());
printDeque(d3);
deque<int>d4;
d4.assign(2,10);
printDeque(d4);
206 大小操作
deque<int>d1;
if (d1.empty())
cout << "空" << endl;
else
cout << "不空" << endl;
for (int i = 0; i < 6; i++)
{
d1.push_back(i);
}
printDeque(d1);
if (d1.empty())
cout << "空" << endl;
else
{
cout << "不空" << endl;
cout << "大小为:"<<d1.size() << endl;
}
d1.resize(10);
printDeque(d1);
d1.resize(15, 1);
printDeque(d1);
d1.resize(5);
printDeque(d1);
207 插入和删除
deque<int>d1;
d1.push_back(1);//尾插
d1.push_back(2);//尾插
d1.push_front(3);//头插
d1.push_front(4);//头插
printDeque(d1);//4 3 1 2
d1.pop_back();//尾删
printDeque(d1);//4 3 1
d1.pop_front();//头删
printDeque(d1);//3 1
//指定位置插入删除
d1.insert(d1.begin(), 1000);
printDeque(d1);//1000 3 1
d1.insert(d1.begin(), 2,1);
printDeque(d1);//1 1 1000 3 1
d1.insert(d1.begin(), d1.begin(), d1.end());
printDeque(d1);//1 1 1000 3 1 1 1 1000 3 1
d1.erase(d1.begin());
printDeque(d1);//1 1000 3 1 1 1 1000 3 1
deque<int>::iterator it = d1.begin();
it++;
d1.erase(it);
printDeque(d1);//1 3 1 1 1 1000 3 1
d1.erase(d1.begin(), d1.end());
printDeque(d1);//
d1.clear();
printDeque(d1);//
208 数据存取
deque<int>d1;
for (int i = 0; i < 6; i++)
{
d1.push_back(i);
}
for (int i = 0; i < d1.size(); i++)
{
cout << d1[i] << " ";
}
cout << endl;
for (int i = 0; i < d1.size(); i++)
{
cout << d1.at(i) << " ";
}
cout << endl;
cout << d1.front() << endl;//首元素
cout << d1.back() << endl;//尾元素
209 排序操作
对于支持随机访问的迭代器,都可以利用sort算法直接对其进行排序(vector)
#include<algorithm>
deque<int>d1;
for (int i = 0; i < 6; i++)
{
d1.push_back(i);
}
for (int i = 6; i >1 ; i--)
{
d1.push_back(i);
}
printDeque(d1); //0 1 2 3 4 5 6 5 4 3 2
sort(d1.begin(), d1.end());
printDeque(d1);//0 1 2 2 3 3 4 4 5 5 6
stack容器
211 基本概念
212 常用接口
stack<int>s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
cout << s.size();
cout << endl;
while (!s.empty())
{
cout<<"栈顶元素:"<<s.top() << endl;
s.pop();
}
cout << s.size();
queue容器
213 基本概念
214 常用接口
list容器
215 基本概念
216 构造函数
list<int>L1;
for (int i = 0; i < 6; i++)
{
L1.push_back(i);
}
printList(L1);
list<int>L2(L1.begin(),L1.end());
printList(L2);
list<int>L3(L1);
printList(L3);
list<int>L4(2,5);
printList(L4);
217 赋值和交换
//赋值
list<int>L1;
for (int i = 0; i < 6; i++)
{
L1.push_back(i);
}
printList(L1);
list<int>L2;
L2 = L1;
printList(L2);
list<int>L3;
L3.assign(L2.begin(),L2.end());
printList(L3);
list<int>L4;
L4.assign(3, 5);
printList(L4);
//交换
list<int>L5;
L5.assign(10, 100);
cout << "swap前" << endl;
printList(L4);
printList(L5);
cout << "swap后" << endl;
L4.swap(L5);
printList(L4);
printList(L5);
218 大小操作
219 插入和删除
220 数据存取
221 翻转和排序
set/multiset容器
223 构造和赋值
set <int>s1;
for (int i = 0; i < 6; i++)
{
s1.insert(i);
}
for (int i = 6; i < 2; i--)
{
s1.insert(i);
}
printSet(s1);//0 1 2 3 4 5
set <int>s2(s1);
printSet(s2);//0 1 2 3 4 5
set <int>s3;
s3 = s2;
printSet(s3);//0 1 2 3 4 5
224 大小和交换
225 插入和删除
set<int>s1;
s1.insert(6);
s1.insert(5);
s1.insert(2);
s1.insert(7);
s1.insert(3);
printSet(s1);//2 3 5 6 7
s1.erase(s1.begin());
printSet(s1);//3 5 6 7
s1.erase(6);
printSet(s1);//3 5 7
s1.erase(s1.begin(), s1.end());//
s1.clear();//
226 查找和统计
set<int>::iterator pos = s1.find(3);
if (pos != s1.end())
{
cout << "找到了" <<*pos<< " ";
cout << "一共" << s1.count(*pos) << "个" << endl;
}
else
{
cout << "没找到" << endl;
}
227 set和multiset区别
set<int>s1;
pair<set<int>::iterator, bool>ret = s1.insert(10);
if (ret.second)
cout << "第一次插入成功" << endl;
else
cout << "失败" << endl;
ret = s1.insert(10);
if (ret.second)
cout << "第二次插入成功" << endl;
else
cout << "第二次失败" << endl;
//第一次插入成功
//第二次失败
multiset<int>s2;
s2.insert(10);
s2.insert(10);
for (multiset<int>::iterator it = s2.begin(); it != s2.end(); it++)
{
cout << *it << " ";
}
cout << endl;//10 10
228 pair对组的创建
pair<string, int>p("Tom", 20);
cout << p.first << " " << p.second << endl;//Tom 20
pair<string, int>p2 = make_pair("Skye", 30);
cout << p2.first << " " << p2.second << endl;//Skye 30
229 内置类型指定排序规则
class MyCompare
{
public:
bool operator()(int a, int b)const
{
return a > b;//降序
}
};
void test01()
{
set<int,MyCompare>s1;
s1.insert(2);
s1.insert(6);
s1.insert(1);
for (set<int, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";//6 2 1
}
cout << endl;
}
230 自定义数据类型指定排序规则
class Person
{
public:
Person(string name, int num)
{
this->m_Name = name;
this->m_Num = num;
}
string m_Name;
int m_Num;
};
class MyComparePerson
{
public:
bool operator()(const Person &p1,const Person &p2)const
{
return p1.m_Num>p2.m_Num;
}
};
void test01()
{
set<Person, MyComparePerson>s;
Person p1("sa", 10);
Person p2("asd", 20);
Person p3("sd", 15);
s.insert(p1);
s.insert(p2);
s.insert(p3);
for (set<Person, MyComparePerson>::iterator it = s.begin(); it != s.end(); it++)
{
cout << it->m_Name << " " << it->m_Num << endl;
}
/* asd 20
sd 15
sa 10*/
}
map/multimap容器
231 构造和赋值
void printMap(const map<int, int>& m)
{
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++)
{
cout << "key="<<it->first<<"value="<<it->second << endl;
}
}
void test01()
{
map<int, int>m;//创建
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(3, 20));
m.insert(pair<int, int>(2, 30));
printMap(m);//key=1value=10
//key = 2value = 30
//key = 3value = 20
map<int, int>m2(m);
printMap(m2);
map<int, int>m3;
m3 = m2;
printMap(m3);
}
232 大小和交换
233 插入和删除
map<int, int>m;
m.insert(pair<int, int>(1, 10));
m.insert(make_pair(2, 20));
m.insert(map<int, int>::value_type(3, 30));
m[4] = 40;//不建议用[]插入,可以利用key访问到value
printMap(m);
m.erase(m.begin());
printMap(m);
m.erase(3);//按照key删除
printMap(m);
234 查找和统计
235 排序