【C++】vector的介绍和使用(下)

简介: 【C++】vector的介绍和使用(下)

C语言题解


int** generate(int numRows, int* returnSize, int** returnColumnSizes) 
{
    int** ret = malloc(sizeof(int*) * numRows); // 指针数组
    *returnSize = numRows; // 指针数组元素的个数
    *returnColumnSizes = malloc(sizeof(int) * numRows); // returnColumnSizes为一级指针的地址
    for (int i = 0; i < numRows; ++i) 
    {
        ret[i] = malloc(sizeof(int) * (i + 1)); // 让指针数组里的指针都指向一块空间
        (*returnColumnSizes)[i] = i + 1;    // 每一行元素的个数
        ret[i][0] = ret[i][i] = 1;
        for (int j = 1; j < i; ++j) 
        {
            ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
        }
    }
    return ret;
}

f5851448661640dc88aff02d98e2f57a.png

C++题解


class Solution 
{
public:
    vector<vector<int>> generate(int numRows) 
    {
        vector<vector<int>> vv;
        vv.resize(numRows);
        for(size_t i = 0; i < vv.size(); i++)
        {
          // vv[i]的类型为vector<int>
            vv[i].resize(i + 1); // 开辟空间
            vv[i][0] = vv[i][vv[i].size()-1] = 1;  
        }
        for(size_t i = 0; i < vv.size(); i++)
        {
            for(size_t j = 1; j < i; j++)
            {
                vv[i][j] = vv[i-1][j-1] + vv[i-1][j];
            }
        }
        return vv;
    }
};

d5589735f0a6490299efe3b3d85ae616.png

👉vector 的增删查改👈


1675831860903.png

operator[ ]和 at 的相同和区别

8132e0dd1e2842f6902141ee765e29bb.png

02f47899888e46d285e105f7aa1e9d0b.png

at() 函数和 [] 运算符的重载,两者都可以得到相应下标的值,并且两者都会去做边界检查。当发生越界行为时,at 是抛异常,operator[] 是报出 assert 错误。assert 断言在 Release 版本下会被优化掉,不会起作用。


补获异常

a1380110d7f941258fcfe532425ac2f7.png


函数接口什么时候用 const 修饰,什么时候不需要用 const 修饰。


d43afd7ec5ae4de88cc917699202fa58.png

assign

d2a1de4166fe47cf9a8c755114eb34c4.png


void vectorTest4()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (auto e : v)
    {
        cout << e << ' ';
    }
    cout << endl;
    v.assign(10, 1);
    for (auto e : v)
    {
        cout << e << ' ';
    }
    cout << endl;
    string s("hello world");
    v.assign(s.begin(), s.end());
    for (auto e : v)
    {
        cout << e << ' ';
    }
    cout << endl;
}

4f529badc47a47ffbb4ec5c11a54c6b5.png


注:assign的迭代器赋值,迭代器可以是任意类型的迭代器。


7d4ecb9158d549998c5d23532cadba56.png


insert


d2f93375eeab4c9eaf4f3d26222b6de3.png

c11fae26ac8649149b76dbd4a3c2d51a.png


注:string 和 vector 可以用迭代器 + 数字的玩法,而 list 没有。因为 string 和 vector 的空间是连续的,而 list 的空间是不连续的。string 和 vector 的正向迭代器为指针,而 list 的迭代器不是指针。


find


775765ec19c7422bb0650f62d1c79044.png


注:find 函数是算法库里的函数,并不是 vector 的成员函数(因为每个容器有 find 函数,且功能都一样,所以就就设计成库函数了),使用时需要包algorithm头文件。

49f4cf65ccb24648bd52f78d2d9f7fb1.png


那为什么 string 类不直接复用算法库的find函数,要自己设计呢?因为 string 类可能要查找一个子串。


swap

915f33ef5fc04d4c992124dba7577e56.png

4ad286108a34490281c99566c37aaff1.png

注:vector 有专门的模板交换函数,只要是避免使用std::swap这个函数,因为这个函数要3次深拷贝。


10ae8386ab3f4c46a1e35fa92f2995e5.png


注:编译器会调用更加匹配的函数接口。


👉总结👈


以上就是 vector 的介绍和常见接口的使用,下一篇博客将会给大家讲解 vector 的模拟实现。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️

相关文章
|
4月前
|
存储 编译器 C++
【C++】vector介绍+模拟实现
【C++】vector介绍+模拟实现
|
13天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
35 4
|
2月前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
23 1
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
65 6
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
67 7
|
2月前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
2月前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
52 3
|
2月前
|
C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(三)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
2月前
|
编译器 Linux C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(二)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
2月前
|
编译器 C++ 容器
【C++】C++ STL探索:Vector使用与背后底层逻辑(一)
【C++】C++ STL探索:Vector使用与背后底层逻辑