C++面试:向量vector和列表list介绍

这篇具有很好参考价值的文章主要介绍了C++面试:向量vector和列表list介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

vector

list 

list和vector的区别

1. 底层实现:

2. 动态性和静态性:

3. 内存管理:

4. 迭代器和指针:

5. 访问效率:

6. 适用场景:


vector

  std::vector 是 C++ STL 提供的动态数组容器,提供了多种操作。以下是一些常见的 std::vector 操作,一一列举出来

初始化和基本操作

std::vector<int> myVector;  // 初始化一个空的向量
myVector.push_back(1);     // 添加元素到向量末尾
myVector[2] = 10;          // 访问和修改向量元素
int size = myVector.size(); // 获取向量大小

插入和删除元素

myVector.insert(myVector.begin() + 1, 4); // 插入元素到指定位置
myVector.erase(myVector.begin() + 2);    // 删除指定位置的元素
myVector.clear();                         // 清空向量

 范围操作

std::vector<int> source = {1, 2, 3, 4, 5};
std::vector<int> destination = source; // 复制整个向量
std::vector<int> subVector(source.begin() + 1, source.begin() + 4); // 复制部分向量

元素访问和遍历

int elementAtIndex2 = myVector[2]; // 使用下标访问元素

// 使用迭代器访问元素
for (std::vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {
    // ...
}

// 使用范围-based for 循环
for (const auto& element : myVector) {
    // ...
}

 其他常用方法

int firstElement = myVector.front(); // 获取第一个元素
int lastElement = myVector.back();   // 获取最后一个元素
bool isEmpty = myVector.empty();     // 判断向量是否为空
myVector.resize(8);                  // 改变向量大小

移动语义和右值引用

std::vector<std::string> source = {"apple", "orange", "banana"};
std::vector<std::string> destination(std::make_move_iterator(source.begin()), std::make_move_iterator(source.end()));

使用迭代器进行插入和删除

std::vector<int>::iterator it = myVector.begin() + 2;
myVector.insert(it, 10);   // 在指定位置插入元素
myVector.erase(it + 3);    // 在指定位置删除元素

在特定条件下删除元素

myVector.erase(std::remove(myVector.begin(), myVector.end(), 3), myVector.end());

使用函数对象进行元素变换

struct Square {
    int operator()(int x) const {
        return x * x;
    }
};

std::transform(myVector.begin(), myVector.end(), myVector.begin(), Square());

使用 std::find 查找元素

int searchElement = 5;
auto it = std::find(myVector.begin(), myVector.end(), searchElement);
if (it != myVector.end()) {
    // 元素找到的处理
}

排序向量

std::sort(myVector.begin(), myVector.end());

 反向遍历向量

// 使用逆向迭代器
for (auto it = myVector.rbegin(); it != myVector.rend(); ++it) {
    // ...
}

查找最小和最大元素

auto minElement = std::min_element(myVector.begin(), myVector.end());
auto maxElement = std::max_element(myVector.begin(), myVector.end());

计算向量的和

int sum = std::accumulate(myVector.begin(), myVector.end(), 0);

使用 lambda 表达式进行元素变换

// 将所有元素加倍
std::transform(myVector.begin(), myVector.end(), myVector.begin(), [](int x) { return x * 2; });

使用 std::copy 复制向量

std::vector<int> copyVector;
std::copy(myVector.begin(), myVector.end(), std::back_inserter(copyVector));

将向量转为数组

int* arrayData = myVector.data();

遍历并修改所有元素

for (auto& element : myVector) {
    element *= 2;
}

使用自定义比较函数进行排序

// 按照元素的绝对值进行升序排序
std::sort(myVector.begin(), myVector.end(), [](int a, int b) {
    return std::abs(a) < std::abs(b);
});

使用 std::reverse 反转向量

std::reverse(myVector.begin(), myVector.end());

list 

1. 初始化和基本操作:

#include <list>

std::list<int> myList;           // 初始化一个空的列表
std::list<int> myList2 = {1, 2};  // 使用初始化列表初始化列表

myList.push_back(3);              // 在列表末尾添加元素
myList.push_front(2);             // 在列表开头添加元素

int frontElement = myList.front(); // 获取列表第一个元素
int backElement = myList.back();   // 获取列表最后一个元素

myList.pop_back();                 // 删除列表末尾的元素
myList.pop_front();                // 删除列表开头的元素

2. 插入和删除元素: 

#include <list>

std::list<int> myList = {1, 2, 3, 4};

auto it = myList.begin();
++it; // 移动到第二个元素的位置

myList.insert(it, 5);     // 在指定位置插入元素
myList.erase(it);         // 删除指定位置的元素

myList.remove(3);         // 删除列表中所有值为3的元素
myList.clear();           // 清空列表

3. 迭代器和遍历:

#include <list>

std::list<int> myList = {1, 2, 3, 4};

// 使用迭代器遍历列表
for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
    // ...
}

// 使用范围-based for 循环
for (const auto& element : myList) {
    // ...
}

5. 查找和替换:

#include <list>
#include <algorithm>

std::list<int> myList = {1, 2, 3, 4};

auto it = std::find(myList.begin(), myList.end(), 3); // 查找元素

if (it != myList.end()) {
    // 元素找到的处理
}

myList.unique(); // 删除相邻重复元素

6. 合并和拆分:

#include <list>

std::list<int> myList1 = {1, 3, 5};
std::list<int> myList2 = {2, 4, 6};

myList1.merge(myList2);  // 合并两个已排序的列表

std::list<int> newList;
auto it = std::find(myList1.begin(), myList1.end(), 3);
newList.splice(newList.begin(), myList1, it, myList1.end()); // 从一个列表移动元素到另一个列表

7. 使用自定义类型:

#include <list>
#include <iostream>

// 自定义类型
struct Person {
    std::string name;
    int age;
};

int main() {
    // 使用自定义类型的列表
    std::list<Person> people = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 22}};

    // 访问和修改自定义类型的列表元素
    auto it = people.begin();
    it->age = 32;

    // 迭代自定义类型的列表元素
    for (const auto& person : people) {
        std::cout << person.name << " - " << person.age << " years old" << std::endl;
    }

    return 0;
}

 8. 将列表转为数组:

#include <list>
#include <vector>

std::list<int> myList = {1, 2, 3, 4};

// 将列表转为数组
std::vector<int> myVector(myList.begin(), myList.end());

9. 自定义比较函数进行排序 

#include <list>
#include <algorithm>
#include <iostream>

// 自定义比较函数
bool compare(int a, int b) {
    return a > b;  // 降序排序
}

int main() {
    std::list<int> myList = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};

    // 使用自定义比较函数进行排序
    myList.sort(compare);

    // 输出排序后的列表元素
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

list和vector的区别

1. 底层实现:

  • std::list 使用双向链表实现,每个元素存储下一个元素和前一个元素的地址,因此在插入和删除元素时,效率较高。但是,由于不是连续存储的,随机访问元素的性能较差。

  • std::vector 使用动态数组实现,元素在内存中是连续存储的,支持通过索引进行快速的随机访问。但在插入和删除元素时,可能需要移动其他元素,因此效率相对较低。

2. 动态性和静态性:

  • std::list 是动态容器,可以在运行时动态增加或删除元素。

  • std::vector 是静态容器,其大小在声明时就已经确定,无法动态改变。需要重新分配内存和复制元素才能改变其大小。

3. 内存管理:

  • std::list 每个元素都有独立的内存块,插入和删除元素时不需要移动其他元素,因此内存管理较为灵活。但是,由于链表结构,会带来额外的指针开销。

  • std::vector 元素在内存中是紧密排列的,随机访问效率高。但插入和删除元素可能需要移动其他元素,导致额外的开销。

4. 迭代器和指针:

  std::list 提供双向迭代器,支持双向遍历。

std::list<int>::iterator it = myList.begin();

   std::vector 提供随机访问迭代器,支持快速的随机访问

std::vector<int>::iterator it = myVector.begin();

5. 访问效率:

  • std::list 随机访问效率较低,因为需要沿着链表逐个移动。但在插入和删除元素时,std::list 的性能较好,尤其是在中间位置。

  • std::vector 允许通过索引进行快速的随机访问,因为元素在内存中是连续存储的。然而,在中间插入或删除元素时可能涉及元素的移动,效率较低。

6. 适用场景:

  • std::list 适用于频繁的插入和删除操作,以及在序列中间位置进行操作的场景。

  • std::vector 适用于需要高效随机访问的场景,以及在序列末尾进行插入和删除操作的场景。

        选择使用 std::list 还是 std::vector 取决于具体的使用场景和操作需求。需要根据插入、删除、访问等操作的频率和性能要求来选择合适的容器文章来源地址https://www.toymoban.com/news/detail-816244.html

到了这里,关于C++面试:向量vector和列表list介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 什么时候使用 vector、list、以及 deque?

    什么时候使用 vector、list、以及 deque? 如果需要高效地快速访问(随即存取),并且不在乎插入和删除的效率,使用 vector 如果需要大量的插入和删除,而且不关心快速访问 (随即存取) ,使用 list 如果需要快速访问(随即存取) ,并且关心两端数据插入和删除,使用 deque 推荐一个零

    2024年02月10日
    浏览(35)
  • c++ deque vector set list comparison

    deque: Not continuous memory. Lookup needs twice access to find the correct block, then the right location of the data in the block. efficiency at front and end inserting and removing. vector: stored in continuous memory. access by index. Insertion, deletion, moving elements costs a lot. Set: It is a type of associative container in which each element has to

    2024年02月12日
    浏览(42)
  • 【C++】链表(list)的使用以及与vector的区别

    在 C++ 中, std::list 是标准库提供的一个容器类,用于将数据进行链式存储。 链表 (list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。 链表的组成:链表由一系列 结点 组成。 结点的组成:1.存储数据元素的 数据域 2.存储

    2024年02月06日
    浏览(44)
  • 【C++进阶(五)】STL大法--list模拟实现以及list和vector的对比

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 本篇文章立足于上一篇文章: list深度剖析(上) 请先阅读完上一篇文章后再阅读这篇文章! 本章重点: 本章着重讲解list的模拟实现 list模拟实

    2024年02月09日
    浏览(53)
  • R语言如果列表中有列表,且每个子列表有一个向量:如何转变为仅仅一个列表里面含有向量

    引言 有些时候,比如批量读取表格中的某一列的时候,最终你会得到列表里面装列表,且每个列表里面只有一个向量的情况。我们的目标是不要中间这一层列表,而是直接变成列表-向量这种简单的结构,如何完成呢。我觉得有很多方法,而我在这分享一种最简单的办法。 一

    2024年02月11日
    浏览(40)
  • [STL-list]介绍、与vector的对比、模拟实现的迭代器问题

     list的底层是 带头双向链表 结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 与其他的序列式容器相比(array,vector,deque),list通常 在任意位置进行插入、移除元素的执行效率更好 list最大的缺陷是 不支持任意位

    2024年04月15日
    浏览(95)
  • C++中vector、list和deque的选择:什么时候使用它们?

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在C++中,vector、list和deque是STL(标准模板库)提供的三种常见的容器。每种容器都有其特点和适用场景。本文将详

    2024年02月13日
    浏览(39)
  • C++:关于模拟实现vector和list中迭代器模块的理解

    本篇是关于 vector 和 list 的模拟实现中,关于迭代器模块的更进一步理解,以及在前文的基础上增加对于反向迭代器的实现和库函数的对比等 本篇是写于前面模拟实现的一段时间后,重新回头看迭代器的实现,尤其是在模板角度对 list 中迭代器封装的部分进行解析,希望可以

    2024年02月07日
    浏览(44)
  • 自然语言处理从入门到应用——全局向量的词嵌入:GloVe(Global Vectors for Word Representation)词向量

    分类目录:《自然语言处理从入门到应用》总目录 无论是基于神经网络语言模型还是word2vec的词向量预训练方法,本质上都是利用文本中词与词在局部上下文中的共现信息作为自监督学习信号。除此之外,另一类常用于估计词向量的方法是基于矩阵分解的方法,例如潜在语义

    2024年02月09日
    浏览(45)
  • Midjourney命令列表Command List介绍

    您可以通过键入命令与Discord上的Midjourney Bot进行交互。命令可以用来生成图像、更改默认设置、监看用户信息以及执行其他有用的任务。 Midjourney 命令可以在任何Bot Channel中使用,在允许 Midjourney Bot 运行的私有 Discord 服务器上使用,或者在与 Midjourney Bot 的直接消息中使用。

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包