IE盒子

搜索
查看: 217|回复: 1

C++之STL

[复制链接]

3

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-11-26 16:58:02 | 显示全部楼层 |阅读模式
对比于C来讲,C++中的STL确实让人非常舒服,因为大家都可以统一起来,这样无论是写自己的代码还是读别人的代码都会非常轻松。今天小小对之前学习的内容总结一波。
那什么是STL呢。C++ STL(标准模板库)是一套功能强大的C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。 容器是用来管理某一类对象的集合。 C++ 提供了各种不同类型的容器,比如deque、list、vector、map 等。
balabala的说了一堆,其实STL对我来讲感觉就是一个“包”,就是我们不用自己写数组,自己写队列这些,调用别人规定好的模板就OK,因为STL去除了面向对象性,通用性很高,随便用,而且这样大家的代码一致性高,一起写项目的时候就会很舒服。
1. string

string 是封装好的字符串容器。并不与char等同,如需使用char,需要进行转换成c_str()。
char 只能进行单个操作,无法做到像 string 直接操作这么简洁。
输入如下
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

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

    string s2;
    char s[1024];

    // C++提供的输入流cin其实输入速度比scanf慢很多,但scanf并不能用来往string中做输入
    scanf("%s",s);  // 数组名是根地址
    s2 = s;

    // 字符串的加法运算
    s2 += "abc";
    s2.append("456");

    // 删除操作,利用迭代器
    string::iterator it = s2.begin();
    // 删除s2[6]-s[8]
    s2.erase(it+6,it+9);

    s2.clear() // 全清
    return 0;
}
查找操作

可以利用find函数找到string里面第一个要找到的元素(char或者串),并返回在字符串中第一次出现的下标,找不到就返回-1.
string s1;
s1 = "haokai-su";
int n = s1.find("ao");
int m = s1.find('-');

n = s1.find("ao",2);  // 从第二个元素开始找。
string 与char*的互相转换

其实 string 的内部就是一个 char 字符数组。 private final char value[];这是string内部用来储值的结构。
string s_string;
char s_char[1000];
scanf("%d",s_char);

s_string = s_char;

// printf 输出char*时用c_str处理
printf(s_string.c_str());
cout << endl;

printf("%s",s_char);
cout << endl;
string 与 数字的互相转换

int n = 123456.123456;
string s = to_string(n);

string a = "123456";
int n = a.stoi(a);
2. 迭代器 iterator

目前在我看来,迭代器就是给我提供了容器中各个元素的指针,以供我读取和改变。可用于遍历操作。
《ACM程序设计》:迭代器就是把所有有关的东西抽象出来,无论是数组的下标,指针,for里面,list里面,vector里面,都可以变成iterator.
vector<int> v;
for(int i = 0; i < 10; i++)
{
    v.push_back(i);
}

// .begin() 是第一个元素的指针  .end()是最后一个元素的下一个的指针
for(vector<int>::iterator it = v.begin(); it != v.end; ++it)
{
    cout << *it << endl;
}
3. sort and reverse

sort 可以实现升序排序(但其实也可以实现降序排序),而 reverse 可以实现反向排序。
语法
vector<int> a(10);

sort(a.begin(),a.end(),less<int>());     // 升序
sort(a.begin(),a.end(),greater<int>());  // 降序

reverse(a.begin(),a.end());
4. pair

将两个不同类型的数据合并成一个大数据,例如 map 中的 key 和 value 是合起来保存的。另一个应用是当一个函数想要返回2个数据的时候,可以选择pair的结构体。
int main()
{
    pair<string,string> a;   // 创建一个空的a,两个元素类型都是string
    // 可以用 first 和 second 来访问第一,二个元素

    a.first = " SuDaxia ";
    a.second = " DaXiasu ";
    /*
        常见于
        queue<pair<int,int>> city;
    */

    return 0;
}
5. map (关联容器)

map 关联容器包含两个部分 key: value
其中,键值 key 既不能重复,也不能被修改(const)
int main()
{
    // 初始化
    map<string,int> mymap = {{"AGE",15}};
    cout << mymap["AGE"] << endl;

    // 向 map 容器中添加新的键值对
    mymap["添加新key"] = 1;

    // 修改 map 中已存键值对中,指定键值对应的值
    mymap["AGE"] = 18;

    // 删除元素
    mymap.erase("AGE");    // 通过 key 索引删除
    mymap.erase(mymap.begin()+1);   // 通过迭代器 iterator 删除

    // for(map<string,int>::iterator iter = mymap.begin(); iter != mymap.end(); iter++)
    for(auto iter = mymap.begin(); iter != mymap.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }

    return 0;
}
6. set (关联容器)

关联容器和顺序容器(诸如vector,queue,list,string)有着根本的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。
set是STL中的常见容器,set中不允许有重复的元素,并且set中的元素是排好序的.
set<int> a; //set 的声明   默认是升序
set<int,greater<int>> a; // 降序排列

// set 可以和 vector 进行互换
vector<int> v;
v = {1,2,3,4};
// vector 转 set
set<int> st(v.begin(),v.end());
v.assign(st.begin(),st.end());
7.设置输出精度

double a = 12.123;

cout << "1: " << a << endl;

cout.setf(ios::fixed);      //使用固定符号生成浮点类型
cout.precision(2);          //设置小数点精度为两位
cout << "2: " << a << endl;

cout.unsetf(ios::fixed);    //取消固定
cout.precision(6);          //恢复默认精度6
cout << "3: " << a << endl;

cout.precision(2);          //未使用cout.setf(ios::fixed)固定小数点
                            //此时作用是设置总精度为两位
cout << "4: " << a << endl;
回复

使用道具 举报

4

主题

11

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2025-3-13 13:31:41 | 显示全部楼层
沙发位出租,有意请联系电话:13838384381
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表