目录
目录
常见C++初级开发岗位要求:熟悉STL标准模板库使用
STL标准模板库概念
STL是一个标准类与函数模板的库
标准类
函数模板
容器类模板
5个基本的序列容器
vector<T>,array<T,N>,list<T>,forward_list<T>, deque<T>
为了方便入门和记忆,采用增删改查以及创建删除类对象进行梳理
vector 矢量容器
创建矢量容器
//容器初始容量为0
vector<int> mydata;
//创建包含100个元素的矢量,全部初始化为0
vector<int> mydata(100);
//初始化100个元素,值均为1
vector<int> mydata(100,1)
//创建后增加容量
vector<int> mydata;
mydata.reverse(100);
添加数据分为随机访问和在最后一个元素插入
push_back(参数)在最后插入
使用insert()可以在矢量容器的任何地方插入一个或多个新元素
删除数据
对应的删除为
pop_back()
vector<int> vec(5,99);
vec.insert(begin(vec)+1,88);
//输出 99 88 99 99 99 99
erase()成员函数
修改数据
查询数据
矢量容器的迭代器
begin()指向容器的第一个元素
end()指向容器的最后一个元素的后一个位置
使用方法有两种
begin(v)
end(v)
v.begin()
v.end()
deque双端队列
智能指针
C++ 标准库提供了两种主要的智能指针类型:
-
std::unique_ptr
:独占所有权的智能指针。它通过禁止拷贝和赋值操作来确保只有一个std::unique_ptr
实例可以管理给定的对象。通常用于实现独占的资源所有权,如动态分配的对象、打开的文件等。可以使用函数模板创建相应的指针。#include <memory> int main() { auto ptr = std::make_unique<double>(3.14); // 使用 ptr 操作 double 对象 return 0; }
-
std::shared_ptr
:共享所有权的智能指针。它允许多个std::shared_ptr
实例共享同一个对象,并在所有引用被释放时自动删除该对象。通过引用计数技术来实现共享所有权的管理。
3. C++11 引入了 std::weak_ptr
,它是用于解决 std::shared_ptr
循环引用问题的一种工具。std::weak_ptr
允许对对象的弱引用,不增加和减少引用计数,不管理对象的生命周期。
weak_ptr连接到一个share_ptr,删除share_ptr对象时,与之相关的weak_ptr变为无效
智能指针的循环引用问题
class A {
public:
std::shared_ptr<B> b;
};
class B {
public:
std::shared_ptr<A> a;
};
int main() {
std::shared_ptr<A> a = std::make_shared<A>();
std::shared_ptr<B> b = std::make_shared<B>();
a->b = b;
b->a = a;
// 引用循环形成,a 和 b 无法被正确释放
}
在上述示例中,对象 A
持有对象 B
的 std::shared_ptr
,而对象 B
持有对象 A
的 std::shared_ptr
,它们之间形成了引用循环。即使在 main()
函数结束后,这两个对象的引用计数仍然不为零,导致它们所占用的内存无法被释放,造成了内存泄漏。
为了解决这个问题,可以将其中一个对象的引用改为 std::weak_ptr
,例如将 A
中的 std::shared_ptr<B>
改为 std::weak_ptr<B>
class A {
public:
std::weak_ptr<B> b;
};
class B {
public:
std::shared_ptr<A> a;
};
int main() {
std::shared_ptr<A> a = std::make_shared<A>();
std::shared_ptr<B> b = std::make_shared<B>();
a->b = b;
b->a = a;
// 引用循环被打破,a 和 b 可以正确释放
}
make_unique函数模板
std::make_unique
是 C++11 标准库中提供的一个函数模板,用于创建具有独占所有权的 std::unique_ptr
对象。
STL常用函数
memset()
初始化集合
参数说明:
(初始化集合,初始化值(0或-1),初始化大小)
memcpy()
在缓冲区之间复制字节。 提供这些函数的更安全版本;请参阅 memcpy_s、wmemcpy_s。
c_str()
char* 和 std::string 类型的相互转化
char* s[255] ="abcde";
std::string str("abcde");
char* pData = str.c_str();// string 转char*
std::string(s); // char* 转 string
snprintf()
int snprintf(
char *buffer,
size_t count,
const char *format [,
argument] ...
);
int _snprintf(
char *buffer,
size_t count,
const char *format [,
argument] ...
);
int _snprintf_l(
char *buffer,
size_t count,
const char *format,
_locale_t locale [,
argument] ...
);
int _snwprintf(
wchar_t *buffer,
size_t count,
const wchar_t *format [,
argument] ...
);
int _snwprintf_l(
wchar_t *buffer,
size_t count,
const wchar_t *format,
_locale_t locale [,
argument] ...
);
template <size_t size>
int _snprintf(
char (&buffer)[size],
size_t count,
const char *format [,
argument] ...
); // C++ only
template <size_t size>
int _snprintf_l(
char (&buffer)[size],
size_t count,
const char *format,
_locale_t locale [,
argument] ...
); // C++ only
template <size_t size>
int _snwprintf(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format [,
argument] ...
); // C++ only
template <size_t size>
int _snwprintf_l(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format,
_locale_t locale [,
argument] ...
); // C++ only
STL常用类
数据读取类:
该类别的类用于读取数据,思考一下,我们在发送数据和处理数据时,除了常见的类型数据,例如int,DWORD,结构体,类对象等,这些数据通常存在内存上,对于键盘输入,文件数据,可用流来读取,C++自带
std::istream
std::istream
是标准库中用于输入流(input stream)的类。它是 std::basic_istream
模板类的实例化,用于从输入设备(例如键盘、文件等)读取数据。
通常使用指针
IStream*
是一个指针类型,表示指向输入流的指针。在 C++ 标准库中,IStream*
通常用来指向输入流对象,用于读取数据。IStream*
实际上是指向 std::istream
或其派生类的指针
std::fstream
如何选择fstream和istream