首页 > 编程语言 >C++中的STL容器和算法

C++中的STL容器和算法

时间:2023-04-29 19:33:22浏览次数:55  
标签:容器 STL 元素 back C++ 算法 vector push include

C++ STL(标准模板库)提供了一组丰富的容器和算法,使得开发者能够更加高效地编写程序。本文将介绍STL中的一些常用容器和算法。

容器

vector

vector是一个动态数组,可以在运行时调整大小。它的优点在于可以快速地访问元素,缺点是在插入和删除元素时需要移动后面的元素。

#include <vector>
#include <iostream>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

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

    v.pop_back();

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

    return 0;
}

除了push_backpop_backvector还提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用v.front()v.back()分别访问首元素和尾元素,使用v.insert()v.erase()在任意位置插入和删除元素。此外,vector还提供了v.empty()v.size()分别判断容器是否为空和获取容器大小。

list

list是一个双向链表,可以在任意位置插入和删除元素,但访问元素比较慢。

#include <list>
#include <iostream>

using namespace std;

int main() {
    list<int> l;
    l.push_back(1);
    l.push_back(2);
    l.push_back(3);

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

    l.pop_back();

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

    return 0;
}

vector一样,list也提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用l.front()l.back()分别访问首元素和尾元素,使用l.insert()l.erase()在任意位置插入和删除元素。此外,list还提供了l.empty()l.size()分别判断容器是否为空和获取容器大小。

map

map是一个键值对容器,可以快速地根据键值查找对应的值。

#include <map>
#include <iostream>

using namespace std;

int main() {
    map<string, int> m;
    m["a"] = 1;
    m["b"] = 2;
    m["c"] = 3;

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

    m.erase("b");

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

    return 0;
}

vectorlist一样,map也提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用m.find()查找元素,使用m.insert()插入元素,使用m.erase()删除元素。此外,map还提供了m.empty()m.size()分别判断容器是否为空和获取容器大小。

算法

除了容器,STL还提供了一些常用的算法,可以方便地操作容器中的元素。

sort

sort是一个排序算法,可以快速地将数组或容器中的元素按照指定规则排序。

#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(3);
    v.push_back(2);
    v.push_back(1);

    sort(v.begin(), v.end());

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

    return 0;
}

sort的第一个参数是要排序的容器的起始地址,第二个参数是要排序的容器的结束地址。这里使用了vectorbegin()end()函数获取迭代器,也可以使用数组名和数组长度作为参数。

sort默认是升序排序,可以通过第三个参数指定排序规则。比如,可以使用greater<int>()降序排序,使用less<int>()升序排序。

find

find是一个查找算法,可以快速地在数组或容器中查找指定元素。

#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    vector<int>::iterator it = find(v.begin(), v.end(), 2);

    if (it != v.end()) {
        cout << "found " << *it << endl;
    } else {
        cout << "not found" << endl;
    }

    return 0;
}

find的第一个参数是要查找的容器的起始地址,第二个参数是要查找的容器的结束地址,第三个参数是要查找的元素。find返回一个迭代器,指向第一个等于要查找元素的位置,如果没有找到则返回容器的结束地址。

除了find,STL还提供了很多其他的查找算法,比如find_if可以根据指定规则查找元素,binary_search可以判断容器中是否含有指定元素,lower_boundupper_bound可以查找元素的下界和上界。

结论

本文介绍了C++ STL中的一些常用容器和算法,它们可以大大提高开发效率,开发者应该熟练掌握它们的使用。除了本文介绍的容器和算法,STL还提供了很多其他的容器和算法,可以根据具体的需求选择使用。在使用STL时,要注意容器和算法的复杂度,避免出现性能问题。

标签:容器,STL,元素,back,C++,算法,vector,push,include
From: https://www.cnblogs.com/xiaowange/p/17364399.html

相关文章

  • C++-#pargma once
    C++-#pargmaoncehttps://baike.baidu.com/item/%23pragmaonce/9468158?fr=aladdin#pragmaonce是一个比较常用的C/C++预处理指令。只在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。基本信息#pragmaonce是编译器相关的,有的编译器支持,有的编译器不支......
  • C++-std::this_thread::get_id()-获取线程id
    C++-std::this_thread::get_id()-获取线程idstd::this_thread::get_id()头文件:<thread>函数:std::this_thread::get_id()用例:std::thread::idthread_id=std::this_thread::get_id();std::thread对象的成员函数get_id()头文件:<thread>函数:std::thread::idget_id()用例:......
  • 一文带你了解区块链中15种共识算法
    所有主要的区块链共识算法解释区块链技术席卷全球,提供了一种去中心化且安全的信息存储和传输方式。它还彻底改变了交易的执行方式,随之而来的是广泛的共识算法。在这里,共识算法在确保区块链网络的完整性方面发挥着关键作用。在本文中,我们将探讨所有主要类型的区块链共识算法、它们......
  • [2core]加解密算法
    本文主要记录从.netframework迁移到.net6后,加解密算法的跨平台测试,如AES和RSA算法。因为RSA使用了BouncyCastle类库提供的实现,所以并没有遇到什么问题。完成加解密算法跨平台测试,迁移工作算是告一段,也标志着从.netframework迁移.net6工作完毕。迁移工作完毕,表示基于.netframewor......
  • C++-改变终端(cout/printf)输出不同颜色的字体-Linux
    C++-改变终端(cout/printf)输出不同颜色的字体-Linuxhttps://blog.csdn.net/qq_41972382/article/details/90311102不同颜色的输出主要依据格式ESC[*m,ESC的八进制为\033,*可以是多个属性的组合,用,隔开。printf#include<iostream>usingnamespacestd;intmain(){print......
  • C++-标准异常`<exception>`
    C++-标准异常<exception>std::exception定义于头文件<exception>classexception;https://www.apiref.com/cpp-zh/cpp/error/exception.html标准库头文件<stdexcept>https://www.apiref.com/cpp-zh/cpp/header/stdexcept.htmlstd::exceptionstd::bad_allocs......
  • KMP算法
    KMP算法用于解决字符串匹配问题,str1某个字符串是否与str2一样,如果一样,返回str2开始的位置//KMP算法模板intn,m;chars[N],p[M];intne[M];//s[]是长文本,p[]是模式串(短串),n是s的长度,m是p的长度//读入字符串cin>>n>>s+1>>m>>p+1;//KMP算法习惯下标从1......
  • 一文彻底搞懂ZAB算法,看这篇就够了!!!
    最近需要设计一个分布式系统,需要一个中间件来存储共享的信息,来保证多个系统之间的数据一致性,调研了两个主流框架Zookeeper和ETCD,发现都能满足我们的系统需求。其中ETCD是K8s中采用的分布式存储,而其底层采用了RAFT算法来保证一致性,之前已经详细分析了Raft算法的原理,今天主要仔细分......
  • C++用new创建的对象和不用new创建的对象的区别
     在C++中,使用new关键字来创建对象时,与不使用new关键字来创建对象时,会产生以下几个区别:内存管理:使用new关键字来创建对象时,由编译器来决定分配内存的方式,这样可以更有效地利用内存资源。而不使用new关键字来创建对象时,则需要手动分配内存,可能会浪费一些内存资源。对象生命周期......
  • [练习记录] 《算法竞赛进阶指南》打卡活动
    89.a^b题目大意给\(a,b,p\)求\(a^b\modp\)。思路可以直接快速幂。当模数\(p\)为\(1\)的时候特判一下。代码lla,b,mod;llqpow(lla,llb){ llres=1; while(b){ if(b&1)res=res*a%mod; a=a*a%mod,b>>=1; } returnres;}in......