STL用法

STL用法

1、vector的基本用法

(1)定义: 
vectorS;定义一个空的vector对象,存储的是int类型的元素。 
vectorS(n);定义一个含有n个int元素的vector对象。 
(2)基本操作: 
S[i];直接以下标方式访问容器中的元素。 
S.front();返回首元素。 
S.back();返回尾元素。 
S.size();返回表长。 
S.empty();当表为空时返回true,否则返回false。 
S.pop_back();删除表尾元素。 
S.begin();返回指向首元素的迭代器。 
S.end();返回指向尾元素的迭代器。 
S.insert(it , x);向迭代器it指向的元素前插入新元素 x。 
S.insert(it , n , x);向迭代器it指向的元素前插入n个新元素x。 
S.insert(it , first , lase);将由迭代器first和last所指定的序列[first , last)插入到迭代器it所指向的元素前面。 
S.erase(it);删除由迭代器it指向的元素。 
S.erase(first , last);删除由迭代器first和last所指定的序列[first , last)。 
S.reserve(n);预分配缓冲空间,使存储空间至少可容纳n个元素。 
S.resize(n);改变序列的长度,超出的元素将全被删除,如果序列需要扩展(原空间小于n),元素默认值将填满扩展出的空间。 
S.resize(n , val);改变序列的长度,超出的元素将全被删除,如果序列需要扩展(原空间小于n),元素val将填满扩展出的空间。 
S.clear();删除容器中的所有元素。 
S1.swap(S2);容器S1、S2互换。 
S.assign(first , last);将序列替换成由迭代器first和last所指定的序列[first , last)。[first , last)不能是原序列中的一部分。

2、stack的基本用法

(1)定义: 
stackS; 
stackS; 
(2)基本操作: 
S.push(x);x入栈。 
S.pop();出栈(删除栈顶元素,不返回)。 
S.top();访问栈顶元素。 
S.empty();判断栈是否为空(空时返回true,否则返回false)。

3、queue的基本用法

(1)定义: 
queueQ; 
queueQ; 
(2)基本操作: 
Q.push(x);x入队。 
Q.pop();出队(弹出队列第一个元素,不返回)。 
Q.front();访问队首元素。 
Q.back();访问队尾元素。 
Q.empty();判断队列是否为空(空时返回true,否则返回false)。 
Q.size();返回队列中元素的个数。

4、priority_queue的基本用法

  在<queue>头文件中,还定义了另一个非常有用的模板类priority_queue(优先队列)。优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)。 

priority_queue模板类有三个模板参数,第一个是元素类型,第二个容器类型,第三个是比较算子。其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队)。 

(1)定义: 
从大到小输出:priority_queuepq; 
从小到大输出:priority_queue, greater >pq; 
注意两个尖括号之间一定要留空格。 
(2)基本操作:和queue相同。 
(3)自定义:priority_queuepq;

 
  1. struct node //先按x升序,再按y升序
  2. {
  3. friend bool operator< (node n1, node n2)
  4. {
  5. if(n1.x>n2.x) return true;//为什么是 > 因为出队是从尾部先出的
  6. if(n1.x==n2.x&&n1.y>n2.y) return true;
  7. return false;
  8. }
  9. int x,y;
  10. };

5、map基本用法

(1)定义: 
mapm; 
(2)插入元素: 
m[key]=value; 
m.insert(make_pair(key,value)); 
(3)查找元素: 
int i = m[key];注意:当与该键值匹配的值不存在时,会创建键值为key的元素对。 
map::iterator it = m.find(key);如果map中存在与key相匹配的键值时,find操作将返回指向该元素对的迭代器,否则返回的迭代器等于map的end()。 
(4)删除元素: 
m.erase(key);删除与指定key键值相匹配的元素对,并返回被删除的元素的个数。 
m.erase(it);删除由迭代器it所指定的元素对,并返回指向下一个元素对的迭代器。 
(5)map的遍历

 
  1. int main(){
  2. map<string,int> m;
  3. m["a"]=1;
  4. m["b"]=2;
  5. m["c"]=3;
  6. map<string,int>::iterator it;
  7. for(it=m.begin();it!=m.end();++it)
  8. cout<<"key: "<<it->first <<" value: "<<it->second<<endl;
  9. return 0;
  10. }
  11. map<string,int>::iterator it; 定义一个迭代指针it
  12. it->first 为索引键值,it->second 为值。

6、set、multiset、map、multimap功能相似(以set为例)

Iterators: 
begin() end() rbegin() rend() 
Capacity: 
empty size 
Modifiers: 
insert erase clear 
swap //set1.swap(set2) set1和set2互换 
Operations: 
find //it = set1.find(key) 找到返回下标,否则返回set1.end() 
count //cnt = set1.count(key) 返回set1中 key 的个数 
lower_bound //it = set1.lower_bound(key) 大于或等于 key 的最小值的下标 
upper_bound //it = set1.upper_bound(key) 大于 key 的最小值的下标

### STL 标准模板库简介 C++ 的标准模板库 (Standard Template Library, STL) 是一组高效的数据结构和算法的集合[^1]。STL 提供了多种容器类,如 `vector`、`list` 和 `map` 等;提供了迭代器用于遍历这些容器中的元素;还提供了一组通用算法来操作数据。 #### 容器(Container) 容器是用来存储多个对象的对象。STL 中有三类主要容器: - **序列式容器**:按照线性顺序保存元素,例如 `vector`, `deque`, `list`. ```cpp std::vector<int> vec; vec.push_back(1); ``` - **关联式容器**:基于键值对的方式保存元素并保持有序,例如 `set`, `multiset`, `map`. ```cpp std::map<std::string, int> myMap; myMap["one"] = 1; ``` - **无序关联式容器**:类似于关联式容器但是不保证内部元素按特定顺序排列,比如 `unordered_set`, `unordered_map`. ```cpp std::unordered_map<std::string, double> umap; umap["pi"] = 3.1415926; ``` #### 迭代器(Iterator) 迭代器是一种像指针一样工作的对象,可以用来访问容器内的各个元素。通过迭代器可以在不知道具体实现细节的情况下遍历整个容器的内容。 ```cpp for(auto it=vec.begin();it!=vec.end();++it){ cout << *it << endl; } ``` #### 常见算法(Algorithm) 除了上述组件外,STL 还定义了一系列独立于容器类型的泛型算法函数,它们可以直接作用于任何支持随机存取或双向移动特性的范围之上。常见的算法包括但不限于排序(`sort`)、查找(`find`)以及复制(`copy`)等。 ```cpp std::sort(vec.begin(), vec.end()); // 对 vector 排序 if(std::binary_search(sortedVec.begin(), sortedVec.end(), value)){ // 如果找到该数值... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值