C++标准模板库STL(7.27更新)

目录

目录

常见C++初级开发岗位要求:熟悉STL标准模板库使用

STL标准模板库概念

标准类

函数模板

容器类模板

vector 矢量容器

创建矢量容器

删除数据

修改数据

查询数据      

矢量容器的迭代器

deque双端队列

智能指针

智能指针的循环引用问题

make_unique函数模板

STL常用函数

memset()



常见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++ 标准库提供了两种主要的智能指针类型:

  1. std::unique_ptr:独占所有权的智能指针。它通过禁止拷贝和赋值操作来确保只有一个 std::unique_ptr 实例可以管理给定的对象。通常用于实现独占的资源所有权,如动态分配的对象、打开的文件等。可以使用函数模板创建相应的指针。

    #include <memory>
    
    int main() {
        auto ptr = std::make_unique<double>(3.14);
        // 使用 ptr 操作 double 对象
        return 0;
    }
    
  2. 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 持有对象 Bstd::shared_ptr,而对象 B 持有对象 Astd::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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值