C++编程和STL

简介: C++广泛用于竞争性编程。由于其可靠性、高效执行、短片段等,它是首选。它已被大多数编码人员适应,因为它还提供了标准模板库(STL)的好处。

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情


C++广泛用于竞争性编程。由于其可靠性、高效执行、短片段等,它是首选。它已被大多数编码人员适应,因为它还提供了标准模板库(STL)的好处。


C++ STL是编程的支柱。内置函数有时会将代码片段减少到一行。因此,以下是有关C++标准模板库(STL)的一些有趣事实:


1) 值可以通过一对{} 分配给容器。

// 按对分配值的各种方法
// 方法1
pair<int, int> p = make_pair(3, 4);
// 方法2
pair<int, int> p = { 3, 4 };
// 方法3
pair<int, <char, int> > p = { 3, { 'a', 10 } };
复制代码


2) 正如我们熟悉的这对,还有一种称为 元组 的东西。

// 元组可以包含不同类型的元素
tuple t = {3, 4, 5, 'a'};
复制代码

 


3) 我们可以避免写入所有头文件,例如iostream,vector,string,math等。只包含一个头文件就可以完成了这项工作!


头文件是 <bits/stdc++.h>。

#include<bits/stdc++.h>
using namespace std;
复制代码


4) 你不需要为 GCD 函数编写欧几里得算法,相反,我们可以使用 __gcd(值 1, 值 2)。此函数返回两个数字的最大公约数。

Example: __gcd(18, 45) = 9
复制代码
// 演示GCD功能的CPP程序
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int r = __gcd(10, 15);
  cout << r;
  return 0;
}
复制代码


输出

5
复制代码

注意: 这仅适用于 GCC。


5) 在C++中,您可以使用“to_string();” 命令直接将整数转换为字符串。

// CPP程序演示to_string()函数的功能
#include <bits/stdc++.h>
using namespace std;
// 驱动程序代码
int main()
{
  int a = 97;
  string t = to_string(a);
  cout << t;
}
复制代码


输出

97
复制代码

 


6) 在C++中,您可以使用 'stoi();  命令直接将字符串转换为整数。

// CPP程序演示stoi()函数的功能
#include <bits/stdc++.h>
using namespace std;
int main()
{
  string a = "2665";
  int t = stoi(a);
  cout<<t;
}
复制代码


输出

2665
复制代码


(七) 默认情况下,集合按升序存储元素。

set<datatype> setname;
复制代码

注意: set<datatype, greater> setname;用于按降序存储集合中的值。

 


8) 在函数外部声明的每个变量都是静态的,默认值为 0。

// CPP程序,用于演示函数外声明的变量是静态的,默认值为0
#include <bits/stdc++.h>
using namespace std;
int a[5];
int main()
{
  // []中的值为0
  for (int i = 0; i < 5; i++)
    cout << a[i] << " ";
  // b[]中的值是垃圾
  cout << endl;
  int b[5];
  for (int i = 0; i < 5; i++)
    cout << b[i] << " ";
  return 0;
}
复制代码


输出

0 0 0 0 0 
4196880 0 4196368 0 846571392 
复制代码

 


9) 如果你在函数中声明一个数组,它的元素值是垃圾,但要将所有元素的值设置为零,我们可以使用,


TYPE a[n] = { };
复制代码
// CPP程序,用于将函数中数组的所有元素的值设置为零
#include <bits/stdc++.h>
using namespace std;
int main()
{
  // []中的值为0
  int a[5] = {};
  for (int i = 0; i < 5; i++)
    cout << a[i] << " ";
  // b[]中的值是垃圾
  cout << endl;
  int b[5];
  for (int i = 0; i < 5; i++)
    cout << b[i] << " ";
  return 0;
}
复制代码


输出

0 0 0 0 0 
4196896 0 4196368 0 -345132736 
复制代码


10) 数字 x 的二进制表示中的设置位数可以通过 __builtin_popcountll(x)  找到。基本上,此函数计算整数中的 one(设置位)的数量。


// CPP程序演示__builtin_popcountll(x)的功能
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int x = 5; // 0101
  cout << __builtin_popcountll(x);
  return 0;
}
复制代码


输出

2
复制代码

注意: 这仅适用于 GCC。

 


11) Memset 设置内存块的字节值(或无符号字符)。我们可以使用 memset 将整数数组的所有元素初始化为 0 或 -1,但不能初始化其他值。


初始化数组中除 0 或 -1 以外的所有元素不会根据需要设置所有元素,因为 memset 设置字节值,例如,调用 memset(arr, 1, 4) 来设置数组 int arr[4] 的所有元素。它变得0x01 0x01 0x01 0x01。(即 16,843,009,具体取决于您的 CPU 架构)但你的期望值是0x00 0x00 0x00 0x01。


// CPP程序演示memset将整数数组的所有元素初始化为0或-1
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int a[5];
  // A的所有元素都是零
  memset(a, 0, sizeof(a));
  for (int i = 0; i < 5; i++)
    cout << a[i] << " ";
  cout << endl;
  // A的所有元素都是-1
  memset(a, -1, sizeof(a));
  for (int i = 0; i < 5; i++)
    cout << a[i] << " ";
  cout << endl;
  // 不起作用
  memset(a, 5, sizeof(a));
  for (int i = 0; i < 5; i++)
    cout << a[i] << " ";
}
复制代码


输出

0 0 0 0 0 
-1 -1 -1 -1 -1 
84215045 84215045 84215045 84215045 84215045 
复制代码


如果大家发现什么不正确的地方,或者你想分享有关上述的更多内容,可以在下面评论。



目录
相关文章
|
7月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
363 2
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
733 73
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
615 3
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
407 21
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
918 1
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
348 2
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
497 7