《STL详解》读书笔记
vector 向量容器
v.insert(v.begin(), num);//增加
v.erase(v.begin(), v.end()); //擦除
v.erase(v.begin());
reverse(v.begin(), v.end()); //反向排序(从大到小)
sort(v.begin(), v.end(), comp);
-----------------------------------------------------------
string
string::iterator it = s.begin();
s.insert(it, c);
s.replace(pos, pos, c);
s.find(c);
reverse(s.begin(), s.end());
v.insert(v.begin(), num);//增加
v.erase(v.begin(), v.end()); //擦除
v.erase(v.begin());
reverse(v.begin(), v.end()); //反向排序(从大到小)
sort(v.begin(), v.end(), comp);
-----------------------------------------------------------
string
string::iterator it = s.begin();
s.insert(it, c);
s.replace(pos, pos, c);
s.find(c);
reverse(s.begin(), s.end());
char str[10]'
sscanf("bad", "%s", str);
-----------------------------------------------------------
set 集合容器
红黑树:左根右(不允许重复的键值)
set<int> s;
s.insert(num);
set<int>::iterator it;
中序遍历
for(it = s.begin();it != s.end();++it)
cout << *it << " ";
反向遍历
set<int>::reverse_iterator rit;
for(rit = s.rbegin();rit != s.rend();++rit)
cout << *rit << " ";
找到就返回该键值的迭代器位置,否则返回end()
it = s.find(num);
自定义比较函数,要求按键值由大到小的顺序
1、元素不是结构体
struct myComp
{
bool operator()(const int &a, const int &b)
{
return a > b;
}
};
set<int, myComp>::iterator it;
for(it = s.begin();it != s.end();++it)
cout << *it << " ";
2、元素是结构体,把比较函数写在结构体内
struct Info
{
string name;
float score;
//重载' < '操作符,自定义排序规则
bool operator < (const Info &a) const
{
return a.score < score;
}
};
set<Info>::iterator it;
for(it = s.begin();it != s.end();++it)
cout << (*it).name << ":" << (*it).score << endl;
---------------------------------------------------------------
multiset 多重集合容器
删除值为c的所有重复元素,返回删除元素总数
ms.erase(c);
返回第一个元素重复元素的迭代器位置,没有就返回end()迭代器位置
ms.find(c);
---------------------------------------------------------------
map 映照容器
红黑树,键值不重复,比较函数只比较键值
键值重复输入会被覆盖
使用与set集合容器类似
map<int, char>::iterator it;
map<int, char> m;
cout << m.first << m.second << endl;
sscanf("bad", "%s", str);
-----------------------------------------------------------
set 集合容器
红黑树:左根右(不允许重复的键值)
set<int> s;
s.insert(num);
set<int>::iterator it;
中序遍历
for(it = s.begin();it != s.end();++it)
cout << *it << " ";
反向遍历
set<int>::reverse_iterator rit;
for(rit = s.rbegin();rit != s.rend();++rit)
cout << *rit << " ";
找到就返回该键值的迭代器位置,否则返回end()
it = s.find(num);
自定义比较函数,要求按键值由大到小的顺序
1、元素不是结构体
struct myComp
{
bool operator()(const int &a, const int &b)
{
return a > b;
}
};
set<int, myComp>::iterator it;
for(it = s.begin();it != s.end();++it)
cout << *it << " ";
2、元素是结构体,把比较函数写在结构体内
struct Info
{
string name;
float score;
//重载' < '操作符,自定义排序规则
bool operator < (const Info &a) const
{
return a.score < score;
}
};
set<Info>::iterator it;
for(it = s.begin();it != s.end();++it)
cout << (*it).name << ":" << (*it).score << endl;
---------------------------------------------------------------
multiset 多重集合容器
删除值为c的所有重复元素,返回删除元素总数
ms.erase(c);
返回第一个元素重复元素的迭代器位置,没有就返回end()迭代器位置
ms.find(c);
---------------------------------------------------------------
map 映照容器
红黑树,键值不重复,比较函数只比较键值
键值重复输入会被覆盖
使用与set集合容器类似
map<int, char>::iterator it;
map<int, char> m;
cout << m.first << m.second << endl;
struct myComp
{
bool operator ()(const int &a, const int &b)
{
if(a != b)
return a > b;
else
return a > b;
}
};
map<int, char, myComp> m;
m[1] = 'a';
{
bool operator ()(const int &a, const int &b)
{
if(a != b)
return a > b;
else
return a > b;
}
};
map<int, char, myComp> m;
m[1] = 'a';
struct Info
{
string name;
float score;
bool operator < (const Info & a) const
{
return a.score < score;
}
};
map<Info, int>::iterator it;
应用:
用 map 实现数字分离
for(int j = 0;j < 10;++j)
m['0' + j] = j;
数字映照字符
for(int j = 0;j < 10;++j)
m[j] = '0' + j;
--------------------------------------------------------------
multimap 多重映照容器
插入元素需要使用 insert()
pair()将两个数据组合成一个数据, map 中将 key 和 value 放在一起来保存
m.insert(pair<string, double>("Jack", 306));
删除键值为 "Jack" 的元素
m.erase("Jack");
查找元素
m.find("Jack");
------------------------------------------------------------------
deque 双端队列容器
deque 采用分块的线性存储结构存储数据,所有 deque 块用一个 map 块进行管理
以数组方式输出元素
d.pop_front();
d.pop_back();
------------------------------------------------------------------
list 双向链表容器
迭代器只能用“++”或“--”的操作移动
插入新元素时,链表自动扩张
l.push_back();
l.push_front();
删除所有等于 1 的元素
l.remove(1);
l.pop_front();
l.pop_back();
l.erase();
l.find(l.begin(), l.end(), 5);
排序
l.sort();
剔除连续重复元素
l.unique();
-----------------------------------------------------------------
bitset 位集合容器
bitset 对象的大小一旦定义,就不能修改了
bitset<10> b;
将所有元素设为1
b.set();
b.set(pos, 1);
将 pos 位设置为 0
b.reset(pos);
直接向输出流输出所有元素
-----------------------------------------------------------------
stack 堆栈容器
s.push();
s.top();
s.pop();
s.size();
s.empty();
-----------------------------------------------------------------
queue 队列容器
queue<int> q;
q.push();
q.size();
q.front();
q.back();
q.empty();
q.front();//队首
q.back();//队尾
-----------------------------------------------------------------
priority_queue 优先队列容器
队列中最大元素总是位于队首
可以重载 "<" 操作符重新定义比较规则
priority_queue<int> pq;
pq.push(1);
pq.size();
pq.empty();
pq.top();
pq.pop();
{
string name;
float score;
bool operator < (const Info & a) const
{
return a.score < score;
}
};
map<Info, int>::iterator it;
应用:
用 map 实现数字分离
for(int j = 0;j < 10;++j)
m['0' + j] = j;
数字映照字符
for(int j = 0;j < 10;++j)
m[j] = '0' + j;
--------------------------------------------------------------
multimap 多重映照容器
插入元素需要使用 insert()
pair()将两个数据组合成一个数据, map 中将 key 和 value 放在一起来保存
m.insert(pair<string, double>("Jack", 306));
删除键值为 "Jack" 的元素
m.erase("Jack");
查找元素
m.find("Jack");
------------------------------------------------------------------
deque 双端队列容器
deque 采用分块的线性存储结构存储数据,所有 deque 块用一个 map 块进行管理
以数组方式输出元素
d.pop_front();
d.pop_back();
------------------------------------------------------------------
list 双向链表容器
迭代器只能用“++”或“--”的操作移动
插入新元素时,链表自动扩张
l.push_back();
l.push_front();
删除所有等于 1 的元素
l.remove(1);
l.pop_front();
l.pop_back();
l.erase();
l.find(l.begin(), l.end(), 5);
排序
l.sort();
剔除连续重复元素
l.unique();
-----------------------------------------------------------------
bitset 位集合容器
bitset 对象的大小一旦定义,就不能修改了
bitset<10> b;
将所有元素设为1
b.set();
b.set(pos, 1);
将 pos 位设置为 0
b.reset(pos);
直接向输出流输出所有元素
-----------------------------------------------------------------
stack 堆栈容器
s.push();
s.top();
s.pop();
s.size();
s.empty();
-----------------------------------------------------------------
queue 队列容器
queue<int> q;
q.push();
q.size();
q.front();
q.back();
q.empty();
q.front();//队首
q.back();//队尾
-----------------------------------------------------------------
priority_queue 优先队列容器
队列中最大元素总是位于队首
可以重载 "<" 操作符重新定义比较规则
priority_queue<int> pq;
pq.push(1);
pq.size();
pq.empty();
pq.top();
pq.pop();
结构体重载 "<" 操作符
struct Info
{
string name;
float score;
bool operator < (const Info &a) const
{
return a.score < score;
}
};
struct Info
{
string name;
float score;
bool operator < (const Info &a) const
{
return a.score < score;
}
};
从小到大排
struct myComp
{
bool operator ()(const int &a, const int &b)
{
return a > b;
}
};
priority_queue<int, vector<int>, myComp> pq;
struct myComp
{
bool operator ()(const int &a, const int &b)
{
return a > b;
}
};
priority_queue<int, vector<int>, myComp> pq;
现在所有的不幸都是以前不努力造成的。。。