容器的选择

GPT: 在什么情况下,你会选择使用std::vector而不是std::list?请解释你的理由。

答:在存储大量且连续的数据会使用 vector,因为vector的容量的扩充是 以幂次扩充的它特别适合存储大量且连续的数据,相对于list 它还有迭代器的随机访问能力,时间复杂度是O1,这是list做不到的,std::vector在需要频繁随机访问和插入/删除操作主要集中在末尾时性能更优。相比之下,std::list在需要频繁在中间插入或删除元素时更合适,因为它的插入和删除操作不涉及大量元素的移动。

GPT: 描述std::map和std::unordered_map的主要区别,以及它们各自的使用场景。

答:他们两个的区别仅仅在于 ,std::map是基于红黑树实现的,键值对有序且键不允许重复。std::unordered_map是基于哈希表实现的,键值对无序但键同样不允许重复。如果需要保持元素的排序顺序,应该使用std::map;如果不需要排序但更关注查找效率,可以使用std::unordered_map,它提供平均O(1)的查找复杂度

迭代器的类型

GPT: 请解释std::vector的迭代器和std::list的迭代器的主要区别。

答: vector的迭代器的功能是就与list迭代器不同, 因为vector是动态数组所以迭代器的设计也会不同,功能的区别也是不同,vector的迭代器支持随机访问 而 List的迭代器只能去遍历去访问元素

GPT: 什么是反向迭代器(reverse iterator),在什么情况下会使用它?

答: 反向迭代器是做反向遍历的,从容器的末尾向头部遍历,反向迭代器可以用双向迭代器或随机访问迭代器作为基础迭代器

STL算法

GPT: std::sort和std::stable_sort的区别是什么?在什么情况下需要使用std::stable_sort?

答: sort是才用快速排序的算法,不保证稳定性,排序后可能相等的原始顺序被改变,stable_sort是保证稳定性的,就是相等的元素保持原始的顺序不动,这个稳定的代价是需要付出额外的空间复杂度,std::stable_sort通常在对具有相同排序键的对象进行排序时使用,以保留它们在原始输入中的相对顺序,这在一些特定应用场景下非常重要,如按多个字段排序时。

GPT: 如何使用STL算法来查找std::vector中的一个元素,并在找不到时插入该元素?

答: 查找自然是用find();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>

int main(){
int IndexArray[8] = {5,2,7,4,8,66,23};

std::vector<int> Array;
std::vector<int>:: iterator loca_index;

for(int i=0; i<8; i++){
Array.push_back(IndexArray[i]);
}

if(std::find(Array.begin(), Array.end(),2) == Array.end()){
Array.push_back(2);
}

}

函数对象

GPT: 解释什么是函数对象(functor),并举一个自定义函数对象的例子。

答: 就是仿函数,它能像普通函数一样调用,同时它的灵活性更强,它的本质是一个类,就因为是类,他能存储内部状态,可以添加变量,他还能当作参数传给模板,成为一个自定义的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
#include <algorithm>


class Square {
public:
int operator()(int x) const {
return x * x;
}
};

int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::vector<int> squares(numbers.size());

std::transform(numbers.begin(), numbers.end(), squares.begin(), Square());

for(int value : squares) {
std::cout << value << " ";
}
std::cout << std::endl;

return 0;
}