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 
复制代码


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



目录
相关文章
|
3月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
507 69
|
21天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
25 1
|
1月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
51 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
96 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
100 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
77 2
|
2月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
80 0
|
1月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
46 0
|
3月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
470 16
|
2月前
|
消息中间件 存储 安全