STL-题目解析

server/2024/10/18 12:46:16/
  1. 下面有关vector和list的区别,描述错误的是( )

A.vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随机存取,应该使用vector

B.list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用list

C.vector::iterator支持“+”、“+=”、“<”等操作符

D.list::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[ ]运算符

解析:

A.如果想大量随机读取数据操作,vector是首选的容器

B.如果想大量的插入和删除数据,list效率较高,是首选

C.由于vector底层是连续空间,其迭代器就是相应类型的指针,所以支持对应的操作

D.list迭代器不支持[]运算符

  1. 以下代码实现了从表中删除重复项的功能,请选择其中空白行应填入的正确代码( )
template<typename T>
void removeDuplicates(list<T> &aList)
{T curValue;list<T>::iterator cur, p;cur = aList.begin();while (cur != aList.end()){curValue = *cur;//空白行 1p=++cur;while (p != aList.end()){if (*p == curValue){//空白行 2p == cur ? cur = p = aList.erase(p) : p = aList.erase(p);}else{p++;}}}
}
A. p=cur+1;aList.erase(p++);
B. p=++cur; p == cur ? cur = p = aList.erase(p) : p = aList.erase(p);
C. p=cur+1;aList.erase(p);
D. p=++cur;aList.erase(p);

解析:首先选B 选项

A.C 错误,迭代p需要迭代不重复节点的下一节点,p = cur+1;<font style="color:rgb(5, 7, 59);">std::list</font> 的迭代器是双向迭代器,它们不支持使用加法运算符(<font style="color:rgb(5, 7, 59);">+</font>)来直接前进到某个特定的位置。

B.D分析:D:中空白行2是当需要找到重复值时进行节点删除,当删除时当前迭代器会失效,因此需要将迭代器p往后迭代, p = aList.erase§这样迭代器才会向后移动,因为在<font style="color:rgb(5, 7, 59);">erase()</font>函数会删除指定迭代器位置上的元素,并返回指向被删除元素下一个位置的迭代器。如果删除的是容器中的最后一个元素,则返回的是容器末尾的迭代器,即<font style="color:rgb(5, 7, 59);">end()</font>迭代器。

B:p=++cur;这段代码中p和cur都指向curValue的下一个元素,故可能出现 *p == curValue,且 p == cur,当出现这种情况时,需要删除p指向的元素,并将cur和p向后移动,如果只是p = aList.erase§时,cur迭代器会失效。

  1. 以下程序输出结果为( )
int main()
{int ar[] = { 0,1, 2, 3, 4,  5, 6, 7, 8, 9 };int n = sizeof(ar) / sizeof(int);list<int> mylist(ar, ar+n); list<int>::iterator pos = find(mylist.begin(), mylist.end(), 5);reverse(mylist.begin(), pos);reverse(pos, mylist.end());list<int>::const_reverse_iterator crit = mylist.crbegin();while(crit != mylist.crend()){cout<<*crit<<" ";++crit;}cout<<endl;
}
A.4 3 2 1 0 5 6 7 8 9
B.0 1 2 3 4 9 8 7 6 5
C.5 6 7 8 9 0 1 2 3 4
D.5 6 7 8 9 4 3 2 1 0

分析:list::iterator pos = find(mylist.begin(), mylist.end(), 5); //找到5的位置

reverse(mylist.begin(), pos);//逆置0 1 2 3 4 为 4 3 2 1 0

reverse(pos, mylist.end()); //逆置5 6 7 8 9 为 9 8 7 6 5

逆置完成之后其数据为:4 3 2 1 0 9 8 7 6 5

list::const_reverse_iterator crit = mylist.crbegin(); //反向迭代器进行反向访问

while(crit != mylist.crend()){}

所以答案为:5 6 7 8 9 0 1 2 3 4

// 将以下代码适配到vector和list中做反向迭代器,理解反向迭代器的原理
namespace bit
{// 适配器 -- 复用template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{Iterator _it;};// vector和list反向迭代器实现
}
namespace bit
{// 将以下代码适配到vector和list中做反向迭代器,理解反向迭代器的原理// 适配器 -- 复用template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{Iterator _it;typedef Reverse_iterator<Iterator, Ref, Ptr> Self;Reverse_iterator(Iterator it):_it(it){}Ref operator*(){Iterator tmp = _it;return *(--tmp);}Ptr operator->(){return &(operator*());}Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}bool operator!=(const Self& s){return _it != s._it;}};template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;// 反向迭代器适配支持typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;const_reverse_iterator rbegin() const{// list_node<int>*return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}// ...}
namesapce std
{template<class T>class list{typedef list_node<T> Node;public:typedef __list_iterator<T, T&, T*> iterator;	typedef __list_iterator<T, const T&, const T*> const_iterator;// 反向迭代器适配支持typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;const_iterator begin() const{// list_node<int>*return const_iterator(_head->_next);}const_iterator end() const{return const_iterator(_head);}iterator begin(){return iterator(_head->_next);//return _head->_next;}iterator end(){return iterator(_head);}const_reverse_iterator rbegin() const{// list_node<int>*return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}//...}
}

下面程序的输出结果正确的是( )

int main()
{int array[] = { 1, 2, 3, 4, 0, 5, 6, 7, 8, 9 };int n = sizeof(array) / sizeof(int);list<int> mylist(array, array+n);auto it = mylist.begin();while (it != mylist.end()){if(* it != 0)cout<<* it<<" ";elseit = mylist.erase(it);++it;}return 0;
}
A.1 2 3 4 5 6 7 8 9
B. 1 2 3 4 6 7 8 9
C.程序运行崩溃
D.1 2 3 4 0 5 6 7 8 9

对于list有迭代器it, 当erase(it)后,说法错误的是( )

A.当前迭代器it失效

B.it前面的迭代器仍然有效

C.it后面的迭代器失效

D.it后面的迭代器仍然有效

分析:选C ,<font style="color:rgb(5, 7, 59);">erase()</font>函数会删除指定迭代器位置上的元素,并返回指向被删除元素下一个位置的迭代器。如果删除的是容器中的最后一个元素,则返回的是容器末尾的迭代器,即<font style="color:rgb(5, 7, 59);">end()</font>迭代器。

下面有关vector和list的区别,描述正确的是( )

A.两者在尾部插入的效率一样高

B.两者在头部插入的效率一样高

C.两者都提供了push_back和push_front方法

D.两者都提供了迭代器,且迭代器都支持随机访问

分析:选A,vector由于在头部插入数据效率很低,所以没有提供push_front方法

下列代码的运行结果是( )

void main()
{stack<char> S;char x,y;x='n';y='g';7S.push(x);S.push('i');S.push(y);S.pop();S.push('r');S.push('t');S.push(x);S.pop();S.push('s');while(!S.empty()){x = S.top();S.pop();cout<<x;};cout<<y;
}
A.gstrin	B.string	C.srting	D.stirng

分析:选B,

下列代码的运行结果是( )

void main()
{queue<char> Q;char x,y;x='n';y='g';Q.push(x);Q.push('i');Q.push(y);Q.pop();Q.push('r');Q.push('t');Q.push(x);Q.pop();Q.push('s');while(!Q.empty()){x = Q.front();Q.pop();cout<<x;};cout<<y;
}
A.gstrin	B.grtnsg	C.srting	D.stirng

分析:选B,

一个栈的输入顺序是a,b,c,d,e则下列序列中不可能是出栈顺序是( )

A.e,d,a,c,b

B.a,e,d,c,b

C.b,c,d,a,e

D.b,c,a,d,e

分析:选A

以下是一个二叉树的遍历算法,queue是FIFO队列,请参考下面的二叉树,根节点是root,正确的输出是( )

1

2 3

4 5 6 7

queue.push(root);
while(!queue.empty())
{node = queue.top();queue.pop();                             output(node->value)    //输出节点对应数字if(node->left)queue.push(node->left);if(node->right)queue.push(node->right);   
}
A.1376254
B.1245367
C.1234567
D.1327654

分析:选C

. - 力扣(LeetCode)

#include<stack>
class MinStack {
public:stack<int> mystack;stack<int> minstack;MinStack() {}void push(int val) {if(minstack.empty()||val<=minstack.top()){minstack.push(val);}mystack.push(val);}void pop() {if(minstack.top()==mystack.top()){minstack.pop();}mystack.pop();}int top() {return mystack.top();}int getMin() {return minstack.top(); }};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

分析:

画板

栈的压入、弹出序列_牛客题霸_牛客网

class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param pushV int整型vector* @param popV int整型vector* @return bool布尔型*/bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {stack<int> mystack;while (!popV.empty()) {if (!pushV.empty()) {mystack.push(pushV.front());pushV.erase(pushV.begin());}while (mystack.top() == popV.front()) {mystack.pop();popV.erase(popV.begin());if(popV.empty()){return true;}if(mystack.empty()){break;}}if (pushV.empty() && !popV.empty()) {return false;;}}return true;}};

思路分析:

画板

逆波兰表达式

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> mystack;while(!tokens.empty()){if(tokens.front()=="+"){tokens.erase(tokens.begin());int a = mystack.top();mystack.pop();int b = mystack.top();mystack.pop();mystack.push(a+b);}else if(tokens.front()=="-"){tokens.erase(tokens.begin());int a = mystack.top();mystack.pop();int b = mystack.top();mystack.pop();mystack.push(b-a);}else if(tokens.front()=="/"){tokens.erase(tokens.begin());int a = mystack.top();mystack.pop();int b = mystack.top();mystack.pop();mystack.push(b/a);}else if(tokens.front()=="*"){tokens.erase(tokens.begin());int a = mystack.top();mystack.pop();int b = mystack.top();mystack.pop();mystack.push(b*a);}else{mystack.push(stoi(tokens.front()));tokens.erase(tokens.begin());}}int ret = mystack.top();return ret;}
};

分析:

画板
有问题,欢迎留言!
(全文完)


http://www.ppmy.cn/server/132761.html

相关文章

计算机系统简介

一、计算机的软硬件概念 1.硬件&#xff1a;计算机的实体&#xff0c;如主机、外设、硬盘、显卡等。 2.软件&#xff1a;由具有各类特殊功能的信息&#xff08;程序&#xff09;组成。 系统软件&#xff1a;用来管理整个计算机系统&#xff0c;如语言处理程序、操作系统、服…

54 | 享元模式(上):如何利用享元模式优化文本编辑器的内存占用?

上一篇文章中&#xff0c;我们讲了组合模式。组合模式并不常用&#xff0c;主要用在数据能表示成树形结构、能通过树的遍历算法来解决的场景中。今天&#xff0c;我们再来学习一个不那么常用的模式&#xff0c;享元模式&#xff08;Flyweight Design Pattern&#xff09;。这也…

总结:SQL查询变慢,常见原因分析!

文章目录 引言SQL查询慢原因索引失效特殊情况-执行计划中&#xff0c;key有值&#xff0c;还是很慢怎么办&#xff1f; 多表JOIN为什么互联网公司都不建议使用多表join&#xff1f; 索引基数太小不合理查询字段太多表中数据量太大数据库连接数不够为什么乐观锁还会导致大量的锁…

岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类

岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类 岩石分类检测数据集 (Rock Classification and Detection Dataset) 描述: 本数据集旨在支持对不同类型的岩石进行自动分类和检测&#xff0c;特别适用于地质勘探、矿物识别、环境监测等领域。通过使用该数据集训练的模…

spark:数据的关联与合并、缓存和checkpoint

文章目录 1. 数据的关联与合并1.1 join关联1.1.1 内关联1.1.2 左关联1.1.3 右关联 1.2 Union合并 2. 缓存和checkpoint 1. 数据的关联与合并 1.1 join关联 students表数据&#xff1a; 1.1.1 内关联 内关联只返回两个 DataFrame 中在连接键上匹配的行。 # join 关联 from…

JavaWeb技术支持的Spring Boot在线考试系统详解

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

探索 ffmpeg-python:Python 中的多媒体处理神器

&#x1f3ac; 探索 ffmpeg-python&#xff1a;Python 中的多媒体处理神器 一、背景介绍 在多媒体处理领域&#xff0c;尤其是视频和音频处理&#xff0c;Python 社区一直缺乏一个强大且易用的库。幸运的是&#xff0c;ffmpeg-python 库的出现填补了这一空白。它是一个 Python…

分享一个IDEA里面的Debug调试设置

1.问题来源 其实我们在这个IDEA里面的这个进行调试的时候&#xff0c;这个是只有步入&#xff0c;出去的选项的&#xff1b; 之前学习这个sort的底层源码的时候&#xff0c;进不去&#xff0c;我们是设置了一个取消java*什么的选项&#xff0c;然后使用这个step into就可以进…