c++常用容器/函数——入门篇

目录

前言

一、容器篇

1.vector动态数组

2.string

3.map

4.set

5.unordered_set

6.pair

二、函数篇

1.sqrt 平方根函数

2.pow 求幂函数

3.fabs以及abs 求绝对值函数

4.fgets

5.isxdigit

6.strcmp

7.tolower 和 toupper

8.islower 和 isupper

9.transform 

10.to_string

11.getline

12.sort 排序函数

13.partial_sort 部分排序函数

14.upper_bound 查找函数

15.count 计数函数

16.all_of 

17.swap 交换函数

18.max_element 和 min_element


前言

我们新手小白在刷题时,写的代码往往冗长而臃肿,不够简洁高效,比如我就喜欢写屎山代码(狗头),这篇文章介绍了我刷题这几个月来积累和总结的一些函数和容器(目前只有浅浅的认识,还谈不上认知,但新手阶段应该够用啦),这些函数和容器能够帮助我们新手小白优化代码,提高代码的可读性。另外,有错误和不足的地方,欢迎大家指正与补充。

一、容器篇

1.vector动态数组

介绍:vector是一个动态数组,它可以在运行时根据需要自动调整大小。vector是C++标准库中的一个容器,提供了许多有用的方法和功能,使其成为处理动态数据集合的强大工具。

用法如下:

//创建vector
vector<int> a;//未给定长度
vector<int> a(n);//给定长度为n

//添加元素
a.push_back(b);//从尾部插入b这个元素
cin>>a[i];//从键盘输入一个元素插入到a[i]里(用于长度给定时)
a[i]=b;//直接赋值

//删除末尾元素
a.pop_back();

//获取大小
int len=a.size();

//遍历
for(int i=0;i<a.size();i++)
{
    cout<<a[i]<<endl;
}

//数组拷贝
vector<int> a(b);//将b数组拷贝给a
a=b;//直接赋值也行
vector<int> a(b.begin(),b.end())//此方法可拷贝部分元素

//数组交换
a.swap(b);

2.string

介绍:string是一个非常常用的字符串类,它提供了一系列的成员函数和操作符来方便地处理字符串。使用sting类可以避免C风格字符串的一些问题,比如长度不可变、内存管理等。

用法如下:

    // 创建
    string str;            // 创建一个空的字符串
    string str1 = "Hello"; // 使用字符串字面值初始化
    string str2("world");  // 使用构造函数初始化

    // 字符串的拼接
    string str1 = "Hello";
    string str2 = "world";
    string result = str1 + " " + str2;              // 使用"+"操作符拼接字符串
    string result2 = str1.append(" ").append(str2); // 使用append()函数拼接字符串

    // 字符串的长度和访问
    string str = "Hello";
    len = str.length();   // 获取字符串的长度
    char ch = str[0];     // 使用[]操作符访问字符串的字符
    char ch2 = str.at(1); // 使用at( )函数访问字符串的字符
    
    //字符串的查找和替换
    string str = "Hello world";
    size_t pos = str.find( "world");//查找子字符串的位置
    str.replace(pos, 5,"C++");//替换子字符串

    //字符串的比较 可以使用-=、!=、<、>、<=、>=等操作符来比较字符串的大小
    
    //值得注意的是:在C++中,存储在string中的数字不能直接进行加减运算。因为string类型是一个字符序列,而不是数字类型。如果你想要对存储在string中的数字进行加减运算,你需要先将其转换为数字类型,然后再进行运算。

3.map

介绍:map 是一种关联容器,通常在编程中用于存储键值对,其中每个键都是唯一的,并且与对应的值相关联。在 C++ 中,map 是 <map> 头文件中的模板类.

用法:

    //插入元素
    map<std::string, int> m;
    m["key1"] = 10; // 插入键为 "key1",值为 10 的元素

    //查找元素
    auto it = m.find("key1"); // 如果找到,it指向 ("key1", 10)

    //删除元素
    m.erase(it); // 删除找到的 "key1"

    //遍历
    for (auto it = m.begin(); it != m.end(); ++it) {
    cout << it->first << ": " << it->second << "\n";
    }

4.set

介绍:set 是一种关联容器,它按照元素值的自然顺序(对于可比较的类型)或自定义的比较函数来进行排序。set 实现了集合(或无序不重复元素集)的概念,其中每个元素都是唯一的,并且是有序的,这意味着你可以快速地查找、插入和删除元素(时间复杂度都是O(log n)),而不需要考虑它们在容器中的具体位置。

特点:

  1. 唯一性:容器中的每个元素都是唯一的,不允许重复。
  2. 排序:元素被存储在一个排序好的顺序中,通常是根据元素的自然排序或者提供的比较函数。
  3. 自动排序:当你向 set 中插入元素时,它会自动调整内部结构保持排序。
  4. 范围查找:通过迭代器或下标操作,可以方便地搜索范围内的元素。
  5. 迭代器:提供随机访问和双向遍历的迭代器。

用法:

    //插入元素
    set<int> mySet;
    mySet.insert(5);

    //删除元素
    mySet.erase(3);

    //查找元素
    set<int> : :iterator it = mySet.find( 7 );
    if (it != mySet.end()) {
        //元素存在
    }else 
    {
        //元素不存在
    }

    //遍历
    for (auto it = mySet.begin(); it != mySet.end( ); ++it){
         cout <<*it << " ";
    }

5.unordered_set

介绍:unordered_set是C++标准库中的一个关联容器,它实现了哈希表(Hash Table)的数据结构,用于存储唯一的键值(Key-value对)。这个容器的特点是插入、查找和删除操作的时间复杂度通常为O(1),在理想情况下,无论集合中元素的数量如何,这些操作都能保持高效。

特点:1.哈希函数:每个元素都有一个唯一的哈希值,通过这个哈希值快速定位到存储位置。
           2.冲突解决:当两个元素的哈希值相同(冲突),容器会使用链地址法或开放寻址法来处理。
           3.无序性:由于哈希表的特性,unordered_set内部的元素不是按照插入顺序排列的,而是根        据哈希值的分布随机存储。

           4.键唯一:一个unordered_set中不会有重复的键,如果有重复键试图插入,新的元素将不会        被添加.

用法:

    //定义
    unordered_set<int> mySet;

    //插入元素
    mySet.insert(5);
    mySet.insert(10);

    //查找元素
    if (mySet.find(10) != mySet.end()) {
    cout << "Found 10 in the set." << endl;
    }

    //删除元素(自动删除重复元素)
    mySet.erase(5); // 5会从集合中移除

    //遍历
    for (const auto& elem : mySet) {
    cout << elem << " ";
    }

unordered_set和set的区别:

unordered_set和set都是C++标准库中的关联容器,用于存储唯一的元素。它们的主要区别在于数据结构和查找性能:

1.数据结构:
        (1)set是一种有序的集合,内部使用红黑树(平衡二叉搜索树)实现,元素按照自然排序或自定义比较函数的顺序排列。
       (2)unordered_set则是一个无序的集合,内部使用哈希表(散列表)实现,元素的插入和查找操作依赖于哈希函数和哈希冲突解决策略,如开放寻址法或链地址法。

2.查找性能:
        (1)对于set,查找、插入和删除操作的时间复杂度通常为O(log n),因为红黑树的性质保证了搜索的效率。
        (2)unordered_set的查找、插入和删除平均时间复杂度为0(1),但在最坏的情况下《哈希冲突严重时),可能会退化到O(n).

3.插入顺序:
       (1)set会保持元素的有序性,插入顺序是有序的。
       (2)unordered_set保证的是快速查找,插入顺序通常是不确定的,取决于哈希函数的结果。

4.内存占用:
       (1)因为unordered_set 需要额外存储哈希信息,所以总体上内存占用可能稍大一些。

6.pair

介绍:pair是一个非常基础但实用的模板类,它是C++标准库的一部分。pair用于存储两个不同类型的数据元素,并提供了一种简单的方式来处理成对的数据。pair类模板有两个模板参数,分别代表两个元素的类型(通常称为first_typesecond_type)。

用法:

pair<int, string> myPair(42, "Hello World");
//myPair.first将访问第一个元素(整数),myPair.second访问第二个元素(字符串)。
//pair的一些重要操作包括:
//make_pair:工厂函数用于创建pair对象。
//访问元素:通过.first和.second。
//解引用:*pair或pair.first、pair.second。
//简单的比较运算符:==, <, >等。

二、函数篇

函数篇包含了很多c语言中常用的函数(毕竟c包含于c++嘛)

先来点开胃小菜

1.sqrt 平方根函数

y=sqrt(x);

2.pow 求幂函数

 y=pow(x,4);    (求x的四次方)

3.fabs以及abs 求绝对值函数

	y=fabs(x); //x为浮点数
	y=abs(x);  //x为整数

4.fgets

介绍:fgets函数是C语言中用于从文件或标准输入流中读取一行数据的函数。

str是一个指向字符数组的指针,用于存储读取到的字符串; n是一个整数,表示最多读取的字符数(包括换行符和空字符) ; stream是一个指向FILE结构的指针,表示要读取的文件流。
fgets函数会从指定的文件流中读取字符,直到遇到换行符(包括换行符)或者读取的字符数达到n-1为止。读取到的字符会存储在str指向的字符数组中,并在末尾添加一个空字符'10'。如果读取成功,则返回str的值;如果到达文件末尾或者发生错误,则返回NULL。

char str[100];
fgets(str,sizeof(str),stdin);

需要注意的是,fgets函数会将换行符也读取进来,所以如果需要去掉换行符,可以使用strcspn函数来实现:

str[strcspn(),"\n"]="\0";

5.isxdigit

介绍:isxdigit函数是C语言中的一个字符处理函数,用于判断一个字符是否是十六进制数字。

char a = 'A';
int b = isxdigit(x);

如果该字符是一个十六进制数字(即0-9、A-F、a-f),则返回非零值(真),否则返回0(假)。

6.strcmp

介绍:strcmp函数是C语言中的字符串比较函数,用于比较两个字符串的大小关系。

int result = strcmp(str1,str2);

该函数接受两个参数,分别是要比较的两个字符串的指针。函数返回一个整数值,表示两个字符串的大小关系。如果返回值为0,表示两个字符串相等;如果返回值小于0,表示str1小于str2;如果返回值大于0,表示str1大于str2。
strcmp函数会逐个比较两个字符串对应位置的字符,直到遇到不相等的字符或者其中一个字符串的结束符"\0"。比较时使用的是字符的ASCII码值进行比较。

7.tolower 和 toupper

介绍:tolower函数是C/C++标准库中的一个字符处理函数,用于将一个大写字母转换为小写字母。它接受一个字符作为参数,并返回相应的小写版本,如果输入的是非字母字符,则原样返回。这个函数通常在需要进行大小写不敏感比较,或者规范化文本格式时使用。

char c = 'A';
char lower_c = tolower(c); // lower_c 现在是 'a'

toupper则是小写字母转大写字母,用法同tolower相同

以上就是c中常用的一些(我目前积累的)函数啦,当然c++中也能使用,接下来就是独属于c++的一些常用(我目前积累的)函数啦!

8.islower 和 isupper

介绍:islower是C++标准库中的一个字符处理函数,它属于<cctype>头文件。这个函数用于检查一个字符是否为小写字母。在C++中,islower接受一个int类型的值(通常是一个ASCII或Unicode字符),如果是小写字母(ASCI值从a到z或等效的Unicode值),则返回非零值(通常是true或1),否则返回0或false。

char c = 'b';
if(islower(c))
{
    //c是小写字母时执行
}else
{
    //c不是小写字母时执行
}

isupper与其用法相同,用于判断一个字符是否为大写字母。

9.transform 

介绍:在C++中,transform是一个标准库算法,属于<algorithm模块,用于对容器中的元素进行某种操作,并将结果存储在另一个容器中,通常是原容器的相同位置。transform函数通常配合迭代器使用,适用于数据处理和数组操作。

用法:

//基本语法
template <class InputIterator1, class InputIterator2, class OutputIterator, class UnaryOperation>
OutputIterator transform(InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, InputIterator2 last2,OutputIterator result, UnaryOperation op);

参数说明:

  • InputIterator1 和 InputIterator2 是输入范围的起始和结束迭代器,通常是容器的begin()和end()。
  • OutputIterator 是结果的开始位置,用于存放处理后的元素。
  • UnaryOperation 是一个单参数函数对象或函数指针,表示对每个元素进行的操作。
//eg:如果一个字符串(全为字母)第一个字符是大写字母则将其全部变为小写
string s;cin>>s;
if(isupper(s[0]))transform(s.begin(),s.end(),s.begin(),std::tolower);

10.to_string

介绍:to_string通常是一个函数或方法,用于将某种数据类型转换成字符串格式,以便于在文本输出中展示或处理。

用法:

string str = to_string(123);//将整数123转换为字符串"123"

11.getline

介绍:getline是C++标准库中的一个函数,它用于从输入流(如cin)读取一行文本,直到遇到换行符(n)为止。这个函数的主要作用是将用户输入或文件内容作为字符串处理,而不是像cin一样默认读取到空格就停止。

用法:

string line;
getline(cin,line);

这里,line变量会存储用户输入的一整行文本,包括空格和换行符。如果你只想要文本到换行符为止,不包含换行符,可以使用:

getline(cin,line,'\n');

12.sort 排序函数

介绍:在C++中,sort是一个用于对容器的元素进行排序(升序)的函数。它可以对数组、向量、列表等容器进行排序操作。sort函数使用的是快速排序算法,它是一种高效的排序算法。

用法:

vector<int> a = {5,2,8,4,9};
sort(a.begin(),a.end());

除了默认的升序排序外,sort函数还可以接受一个可选的比较函数作为第三个参数,用于指定排序的方式。比较函数应该返回一个bool值,表示两个元素的大小关系。如果返回true,则表示第一个元素应该排在前面;如果返回false,则表示第二个元素应该排在前面。

bool compare(int b, int c) {
    return b > c;
}

// 使用自定义比较函数
sort(a.begin(), a.end(), compare);

13.partial_sort 部分排序函数

介绍:partial_sort函数是STL中的一个函数,用于部分排序一个范围内的元素。它会将指定范围内的前m个元素按照升序排列,其余元素保持未排序状态。

用法:

partial_sort(a.begin(), a.begin() + m, a.end());

14.upper_bound 查找函数

介绍:upper_bound是C++标准库中的一个函数,用于在有序序列中查找第一个大于给定值的元素的位置。

用法:

int it = upper_bound(a.begin(),a.end(),x)//查找a中第一个大于x的元素,并返回其下标

需要注意的是该函数只能用于有序函数

15.count 计数函数

介绍:count函数用来快速查找一个数组中某个数字出现的个数。count函数定义在<algonithmo头文件中,它接受三个参数:要查找的数组的起始迭代器、要查找的数组的结束迭代器和要查找的数字。函数返回值是该数字在数组中出现的次数。

用法:

int count = count(a.begin(),a.end(),x)//返回a中x出现的次数

注意,使用count函数需要包含calgorithm>头文件,并且要确保数组类型支持相等比较运算符(==)。

16.all_of 

介绍:all_of是C++标准库中的一个算法,它属于<algorithms头文件中的一部分,用于检查给定范围内的所有元素是否满足某个谓词(predicate)的条件。这个函数通常与迭代器一起使用,遍历容器或数组,如果对于整个序列的所有元素,谓词返回true,则all_of返回true,否则返回false。

用法:

//判断一个数组中的所有元素是否都大于0
vector<int> a = {1,2,3,4,5};
bool result = all_of(a.begin(),a.end(),[](int x)){return x>0;});

17.swap 交换函数

介绍:swap函数是C++标准库中提供的一种通用函数,它用于交换两个变量的值,而无需关心它们的具体类型。它的作用是在不使用临时变量的情况下,直接交换两个对象的值。swap函数在<algorithm>头文件中定义。

用法:

int x = 10;
int y = 20;
swap(x, y); // 现在x的值为20,y的值为10

swap函数可以用来交换各种数据类型的值,包括但不限于:

  1. 值类型(如基本类型:int, float, char等)
  2. 指针类型:它可以交换两个指针指向的内容
  3. 复合类型:如数组、结构体、类的对象,甚至是自定义的复杂类型。

18.max_element 和 min_element

介绍:max_element是C++标准库algorithm头文件中的一个函数,可以用来查找给定范围内的最大元素。它接受两个迭代器作为参数,第一个迭代器指向要查找的范围的起始位置,第二个迭代器指向要查找的范围的结束位置。如果找到了最大元素,它将返回指向该元素的迭代器。如果要查找的范围为空,则返回指向结束位置的迭代器。

用法:

int a1=*max_element(a.begin(),a.end());
  1. a.begin()a.end() 分别返回数组 a 的起始迭代器和结束迭代器,表示数组的范围。

  2. max_element 函数是一个算法,它遍历这个范围内的元素,并返回第一个找到的最大值的迭代器。当数组是整数类型时,这个函数实际上返回的是指向数组中最大元素的指针。

  3. *min_element 表达式解引用返回的迭代器,获取指向的最大元素,将其赋值给 a1,因此 a1 就存储了数组 a 中的最大值。

min_element用法与之相同。

总结

新手小白第一篇CSDN,欢迎大家指正与补充。因为正在淋雨,所以想和大家一起撑伞。

  • 32
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值