stl标准库系列之--deque
1、概述
deque 是 double-ended queue 的缩写,又称双端队列容器。是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。 在中间部分安插元素则比较费时,因为必须移动其它元素。
我们看下deque的示意图。
2、与vector的区别
- vector是单向开口的连续性空间,deque则是双向开口的连续空间(连续是假象)。
- deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。
- vector扩容时经历了申请空间、复制、释放原空间的过程,deque是在头或尾增加一端定量的连续空间,动态的以分段连续空间组合而成。
- vector对头部的操作比较耗时,但deque擅长对头部元素进行操作,时间复杂度为O(1)。
- vector存储的元素是在连续的空间中,deque不能保证连续空间。
- deque的迭代器较vector迭代器来说复杂的多,因此,除非必要,请尽可能选择vector而非deque。
3、中控器的概念
上面我们看到了,deque与vector还是有明显的区别的。并且deque的连续空间是断章取义的。deque有一段一段的定量连续空间构成。如果在deque的头或者尾增加新空间。deque便会配置一段定量的连续空间,拼接在deque的头或者尾部。保证这些连续空间上的连续假象。避免和vector一样申请、复制、释放。代价是比较复杂的迭代器设计。
deque采取一块有连续空间的map(该map非stl中map)作为中控。该map的元素(我们可以看作是链表中的节点 - node),都是指针。指向另一段比较大的连续空间(称作缓冲区)。这些缓存区才是deque容器的存储主体。
简单来说,我们可以理解为:在内存中有大小相同、彼此不连续的 n 个空间(这些空间各自是连续的)。另外有一块连续的空间,这个空间里面保存了前面的那 n 个空间的指针。我们把这一块连续的空间,称作是deque的中控器。
举个简单的例子,我家有好多粮仓,但是了这些粮仓遍布在整个城市的各个区域,而在郊外的大别墅里面了,有一块地方保存在去这些粮仓的地图和路径。
template <class _Tp, class _Alloc>
class _Deque_base {
public:typedef _Deque_iterator<_Tp,_Tp&,_Tp*> iterator;typedef _Deque_iterator<_Tp,const _Tp&,const _Tp*> const_iterator;protected:_Tp** _M_map; //中控器size_t _M_map_size; //中控器的大小
};
由上面的定义我们可以很明显的看出,map是一个指针,并且定义了size_t类型的变量来表示map的大小。我们再来看下map的初始化。
template <class _Tp, class _Alloc>
void _Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements)
{size_t __num_nodes = __num_elements / __deque_buf_size(sizeof(_Tp)) + 1;_M_map_size = max((size_t) _S_initial_map_size, __num_nodes + 2);_M_map = _M_allocate_map(_M_map_size);_Tp** __nstart = _M_map + (_M_map_size - __num_nodes) / 2;_Tp** __nfinish = __nstart + __num_nodes;__STL_TRY {_M_create_nodes(__nstart, __nfinish);}__STL_UNWIND((_M_deallocate_map(_M_map, _M_map_size), _M_map = 0, _M_map_size = 0));_M_start._M_set_node(__nstart);_M_finish._M_set_node(__nfinish - 1);_M_start._M_cur = _M_start._M_first;_M_finish._M_cur = _M_finish._M_first +__num_elements % __deque_buf_size(sizeof(_Tp));
}
我们能够看到,首先,计算了有多少个node,然后再跟_S_initial_map_size比较取较大值。_S_initial_map_size
是一个固定值 8 ,后续会说明。我们以 int 类型距离说明,通过计算,只有当入参__num_elements
的值 ≥ 2560 时,map的大小才会大于8,否则map的初始大小均为 8 。
下面我们看一看中控器的图。
4、迭代器
前面我们已经说过了,deque和vector相似,但是它维护了表面上的空间连续,那么他是怎么维护的。deque的迭代器就会显得至关重要。而迭代器中的operator++和operator–这两个运算子,承担起了这份责任。
- 迭代器首先必须能够指出分段的连续空间在哪里,也就是我们说的缓冲区。
- 其次需要能够判断是否已经在缓冲区的边缘。因为下一次的跳跃就得指向下一个或上一个缓冲区。
下面是deque迭代器的定义。
template <class _Tp, class _Ref, class _Ptr>
struct _Deque_iterator {typedef _Deque_iterator<_Tp, _Tp&, _Tp*> iterator;typedef _Deque_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;static size_t _S_buffer_size() { return __deque_buf_size(sizeof(_Tp)); }typedef random_access_iterator_tag iterator_category;typedef _Tp value_type;typedef _Ptr pointer;typedef _Ref reference;typedef size_t size_type;typedef ptrdiff_t difference_type;typedef _Tp** _Map_pointer;typedef _Deque_iterator _Self;_Tp* _M_cur; //此迭代器所指缓冲区的current元素_Tp* _M_first; //此迭代器所指缓冲区的头 使用push_front时,包含前面的空间_Tp* _M_last; //此迭代器所指缓冲区的尾 包含未使用的空间_Map_pointer _M_node; //指向中控器...
}
从上面定义来看,一个迭代器里面包含了所指向缓冲区的头、尾、current元素以及这块缓冲区对应中控器中的节点。
这个迭代器内部对指针的操作都进行了重载操作,所以我们不能像对待vector迭代器那样来对待他。特别是当迭代器在一个缓冲区的边缘,下一次的跳跃进行缓冲区的切换时,我们看下下面的函数。
void _M_set_node(_Map_pointer __new_node) {_M_node = __new_node;_M_first = *__new_node;_M_last = _M_first + difference_type(_S_buffer_size());
}
当进行node切换时,该迭代器的所指的缓冲区指向新的缓冲区,头指向新缓冲区的头,尾指向尾。
我们同时结合operator++或者operator–操作来看会比较清楚一点。
_Self& operator++() {++_M_cur; //切换至下一个元素if (_M_cur == _M_last) { //如果已到达尾端_M_set_node(_M_node + 1); //设置新的缓冲区,进行跳转_M_cur = _M_first; //指向新缓冲区的第一个第一个元素}return *this;
}
_Self operator++(int) { //后置_Self __tmp = *this;++*this;return __tmp;
}_Self& operator--() {if (_M_cur == _M_first) {_M_set_node(_M_node - 1);_M_cur = _M_last; //需要注意的是,如果进行了减减,则current是先指向新缓冲区的尾,这个在后面我们验证一下}--_M_cur;return *this;
}
_Self operator--(int) {_Self __tmp = *this;--*this;return __tmp;
}
上面我们只是看了迭代在自增和自减时如果面临着缓冲区的跳跃时进行的转换,也就是单步跳跃,那么多不跳跃呢?
_Self& operator+=(difference_type __n)
{difference_type __offset = __n + (_M_cur - _M_first);if (__offset >= 0 && __offset < difference_type(_S_buffer_size()))_M_cur += __n;else {difference_type __node_offset =__offset > 0 ? __offset / difference_type(_S_buffer_size()): -difference_type((-__offset - 1) / _S_buffer_size()) - 1;_M_set_node(_M_node + __node_offset);_M_cur = _M_first + (__offset - __node_offset * difference_type(_S_buffer_size()));}return *this;
}
由上面的定义我们可以看出,多步跳跃跟单步的是差不多的,值得注意的是,如果多步跳跃的步数比较大时,可能会进行map的跨越。
我们基本上已经全部看了迭代器的实现,但是只是这样可能会比较迷糊,还是不能实际的理解,那么,下面我们通过一张图来表示下迭代器长啥样。
由上图可以看出,如果最后一个缓冲区没有存满数据,则end()返回的迭代器能够指向他。
5、定义
在看deque容器的定义之前,我们先看看他的父类。
template <class _Tp, class _Alloc>
class _Deque_base {
public:typedef _Deque_iterator<_Tp,_Tp&,_Tp*> iterator;typedef _Deque_iterator<_Tp,const _Tp&,const _Tp*> const_iterator;typedef _Alloc allocator_type;allocator_type get_allocator() const { return allocator_type(); }_Deque_base(const allocator_type&, size_t __num_elements): _M_map(0), _M_map_size(0), _M_start(), _M_finish() {_M_initialize_map(__num_elements);}_Deque_base(const allocator_type&): _M_map(0), _M_map_size(0), _M_start(), _M_finish() {}~_Deque_base(); protected:void _M_initialize_map(size_t);void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish);void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish);enum { _S_initial_map_size = 8 }; //使用枚举的方式可以在头文件中定义int类型的常量,初始化map的大小protected:_Tp** _M_map; //指向map,map是块连续空间,其中的每个元素都是一个指针(node),指向一块连续的内存空间(缓冲区)size_t _M_map_size; //map的大小,初始值为0iterator _M_start; //表现为第一个节点iterator _M_finish; //表现为最后一个节点typedef simple_alloc<_Tp, _Alloc> _Node_alloc_type;typedef simple_alloc<_Tp*, _Alloc> _Map_alloc_type;_Tp* _M_allocate_node(){ return _Node_alloc_type::allocate(__deque_buf_size(sizeof(_Tp))); }void _M_deallocate_node(_Tp* __p){ _Node_alloc_type::deallocate(__p, __deque_buf_size(sizeof(_Tp))); }_Tp** _M_allocate_map(size_t __n) { return _Map_alloc_type::allocate(__n); }void _M_deallocate_map(_Tp** __p, size_t __n) { _Map_alloc_type::deallocate(__p, __n); }
};
没什么特别需要说明的,注意一下其中的注释就行了。
template <class _Tp, class _Alloc>
void _Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish)
{for (_Tp** __n = __nstart; __n < __nfinish; ++__n)_M_deallocate_node(*__n);
}template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class deque : protected _Deque_base<_Tp, _Alloc> {// requirements:__STL_CLASS_REQUIRES(_Tp, _Assignable);typedef _Deque_base<_Tp, _Alloc> _Base;
public: // Basic typestypedef _Tp value_type;typedef value_type* pointer;typedef const value_type* const_pointer;typedef value_type& reference;typedef const value_type& const_reference;typedef size_t size_type;typedef ptrdiff_t difference_type;typedef typename _Base::allocator_type allocator_type;allocator_type get_allocator() const { return _Base::get_allocator(); }public: // Iteratorstypedef typename _Base::iterator iterator;typedef typename _Base::const_iterator const_iterator;#ifdef __STL_CLASS_PARTIAL_SPECIALIZATIONtypedef reverse_iterator<const_iterator> const_reverse_iterator;typedef reverse_iterator<iterator> reverse_iterator;#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */typedef reverse_iterator<const_iterator, value_type, const_reference, difference_type> const_reverse_iterator;typedef reverse_iterator<iterator, value_type, reference, difference_type> reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */protected: // Internal typedefstypedef pointer* _Map_pointer;static size_t _S_buffer_size() { return __deque_buf_size(sizeof(_Tp)); }protected:
#ifdef __STL_USE_NAMESPACESusing _Base::_M_initialize_map;using _Base::_M_create_nodes;using _Base::_M_destroy_nodes;using _Base::_M_allocate_node;using _Base::_M_deallocate_node;using _Base::_M_allocate_map;using _Base::_M_deallocate_map;using _Base::_M_map;using _Base::_M_map_size;using _Base::_M_start;using _Base::_M_finish;
#endif /* __STL_USE_NAMESPACES */};
6、特点
当需要向容器的两边不停的添加或者删除元素的时候,应该使用deque。比如生产者和消费者中间的仓库。
7、创建方法
#include<deque>
using namespace std;
1、创建一个空的deque
deque(const allocator_type& __a = allocator_type()) : _Base(__a, 0) {}
定义一个元素为int类型的空deque。
std::deque<int> data;
这种方法跟vector、array等一样,在创建了空的deque之后,添加或者删除元素,这种方式比较常见。
2、创建一个含有 n 个元素的deque
deque(size_type __n) : _Base(allocator_type(), __n)
{ _M_fill_initialize(value_type()); }
std::deque<int> data(8);
创建了有8个元素的deque,其中每个元素的默认值均为0。
3、创建一个含有 n 个元素的deque,并为每个元素指定初始值
deque(size_type __n, const value_type& __value, const allocator_type& __a = allocator_type()) : _Base(__a, __n)
{ _M_fill_initialize(__value); }
std::deque<int> d(8, 5);
创建了有8个元素的deque,其中每个元素的初始值均为5。
4、通过拷贝一个deque来创建一个新的deque
deque(const deque& __x) : _Base(__x.get_allocator(), __x.size())
{ uninitialized_copy(__x.begin(), __x.end(), _M_start); }
std::deque<int> data(8);
std::deque<int> data1(data);
拷贝data创建新的deque data1。这种方式下,新旧deque容器的元素类型必须保持一致。
5、通过拷贝其他类型的容器来创建deque
deque(const value_type* __first, const value_type* __last,
const allocator_type& __a = allocator_type())
: _Base(__a, __last - __first)
{ uninitialized_copy(__first, __last, _M_start); }deque(const_iterator __first, const_iterator __last,
const allocator_type& __a = allocator_type())
: _Base(__a, __last - __first)
{ uninitialized_copy(__first, __last, _M_start); }
int array[] = {1, 2, 3, 4};
std::deque<int> data4(array, array + 4);
vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};
std::deque<int> data5(++primes.begin(), --primes.end());
6、赋值
deque& operator= (const deque& __x) {const size_type __len = size();if (&__x != this) {if (__len >= __x.size())erase(copy(__x.begin(), __x.end(), _M_start), _M_finish);else {const_iterator __mid = __x.begin() + difference_type(__len);copy(__x.begin(), __mid, _M_start);insert(_M_finish, __mid, __x.end());}
}
std::deque<int> data(8);
std::deque<int> data1 = data;
下面我们通过一个例子来看看上面的这些情况。
#include <iostream>
#include <deque>
#include <vector>using namespace std;int main(int argc, char* argv[])
{deque<double> data; //创建一个double 类型的空deque容器cout << data.size() << " " << data.max_size() << endl; //0 2305843009213693951deque<int> data1(10); //创建一个int类型的有10个元素deque容器,每个元素默认为0cout << data1.size() << " " << data1.max_size() << endl; //10 4611686018427387903for(deque<int>::iterator itor = data1.begin(); itor != data1.end(); ++itor){cout << *itor << " "; //0 0 0 0 0 0 0 0 0 0}cout << endl << data1.begin()._S_buffer_size() << endl; //128 现在的版本已经对缓冲区这块做了修改,定量大小为 512bytefor(int nIndex = 1; nIndex <= 130; ++nIndex){data.push_back(nIndex);}for(deque<double>::iterator itor = data.begin(); itor != data.end(); ++itor){cout << *itor << " "; // 1 2 3 ... 128 129 130}cout << endl << (++data.begin())._S_buffer_size() << " data size : " << data.size() << endl; //64 data size : 130cout << *(data.begin()._M_first) << " " << *(data.begin()._M_last - 1) << endl; // 1 64 first cachecout << *(data.end()._M_first) << " " << *(data.end()._M_cur - 1) << " " << *(data.end()._M_last - 1) << endl; //129 130 0cout << data.begin()._M_node << " " << data.end()._M_node << endl; //0x1a1f48 0x1a1f58 //实际上被用掉的map的长度 相减为十六进制10 即16,两个double长度然后加end,map实际使用 3deque<int> data2(10, 4); //创建一个int类型的有10个元素deque容器,每个元素默认为4for(deque<int>::iterator itor = data2.begin(); itor != data2.end(); ++itor){cout << *itor << " "; //4 4 4 4 4 4 4 4 4 4}cout << endl;deque<int> data3(data2);for(deque<int>::iterator itor = data3.begin(); itor != data3.end(); ++itor){cout << *itor << " "; //4 4 4 4 4 4 4 4 4 4}cout << endl;int array[] = {1, 2, 3, 4};deque<int> data4(array, array + 4);for(deque<int>::iterator itor = data4.begin(); itor != data4.end(); ++itor){cout << *itor << " "; //1 2 3 4}cout << endl;vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};deque<int> data5(++primes.begin(), --primes.end());for(deque<int>::iterator itor = data5.begin(); itor != data5.end(); ++itor){cout << *itor << " "; //3 5 7 11 13 17}cout << endl;deque<int> data6 = data4;for(deque<int>::iterator itor = data6.begin(); itor != data6.end(); ++itor){cout << *itor << " "; //1 2 3 4}cout << endl;return 0;
}
运行结果如下:
我们针对上面的例子,对其中的一些数据说明一下。
首先,我们看下deque中每个缓冲区的大小。先看下源码中的函数:
inline size_t __deque_buf_size(size_t __size) {return __size < 512 ? size_t(512 / __size) : size_t(1);
}
由上面的函数我们能够看出,当__size < 512 时,缓冲区的大小为512byte。再查看源码中调用该函数的地方,发现,该函数的入参时固定的,为 sizeof(_Tp);也就是说,现在的stl版本中,已经固定了deque的缓冲区大小为512byte。通过上面的例子我们也得到了验证。
cout << endl << data1.begin()._S_buffer_size() << endl; //128 现在的版本已经对缓冲区这块做了修改,定量大小为 512byte
然后我们再看下一个迭代器中的,也就是一个缓存区的大小和deque的大小。这一点在上面的迭代器这一节中我们已经有所了解了。
cout << endl << (++data.begin())._S_buffer_size() << " data size : " << data.size() << endl; //64 data size : 130
接下来我们看下data.begin()和data.end()这两个迭代器中的数据存储规律,我们通过打印发现:
cout << *(data.begin()._M_first) << " " << *(data.begin()._M_last - 1) << endl; // 1 64 first cache
cout << *(data.end()._M_first) << " " << *(data.end()._M_cur - 1) << " " << *(data.end()._M_last - 1) << endl; //129 130 0
计算一下,data的size是130,一个缓冲区中能存放64个double类型数据,那也就是说,data.end()这个迭代器中的数据只有两个,看下上面的打印可知。这样的结果也是我们验证上面迭代器中迭代器的相关属性。
最后我们看下data这个deque中的map使用情况,我们在上面知道了,deque data中map的大小为8,我们通过打印data.begin()和data.end()中node的地址来计算map的实际使用量。如下,相减为十六进制10 即16,两个double长度,然后再加上end()的使用,map实际使用大小为3。
cout << data.begin()._M_node << " " << data.end()._M_node << endl; //0x1a1f48 0x1a1f58 //实际上被用掉的map的长度
8、map的空间扩充
我们来通过一个例子看一下map是怎么进行空间扩充的。实践是学东西的一个很好的方法,以后有不懂的时候,动手实践下可能就会了。
#include <iostream>
#include <deque>
#include <vector>using namespace std;int main(int argc, char* argv[])
{deque<double> data; //创建一个double 类型的空deque容器for(int nIndex = 1; nIndex <= 511; ++nIndex){data.push_back(nIndex);}cout << *(data.begin()._M_first) << " " << *(data.begin()._M_last - 1) << " " << data.size() << endl; //1 64 511cout << *((--data.end())._M_first) << " " << *((--data.end())._M_cur) << " " << *((--data.end())._M_last - 1) << endl; //449 511 0cout << data.begin()._M_node << " " << data.end()._M_node << endl; //0x811fd0 0x812008data.push_back(512);data.push_back(513);cout << data.begin()._M_node << " " << data.end()._M_node << endl; //0x811fd0 0x812010data.push_front(514);data.push_front(515);cout << *(data.begin()._M_cur) << " " << *(data.begin()._M_last - 1) << endl; //515 514cout << *(data.end()._M_first) << " " << *(data.end()._M_cur - 1) << " " << *(data.end()._M_last - 1) << endl; //513 513 0cout << data.begin()._M_node << " " << data.end()._M_node << endl; //0x811fc8 0x812010return 0;
}
运行结果:
通过上面的例子可以看到,我们首先给data里面push_back
511 个元素,刚好在最后一个map未被使用,此时记录data.begin()
和data.end()
包含的node的地址。值为:0x811fd0 0x812008
两者相差56,为7个double类型的空间,然后给data里面再push_back两个元素。记录data.begin()和data.end()包含的node的地址,值为:0x811fd0 0x812010
,发现begin()的值未变,但是end()的值增加了8。其实只push_back一个元素也是同样的结果。因为在push元素之后,发现改缓冲区已经没有空间了,于是申请了下一段连续的空间(缓冲区)。
因此,我们可以得出:deque中map的空间空充进行的是移动构造,并非是拷贝构造,跟vector的控件扩充是由区别的。
移动构造:移动构造函数是c++11的新特性,移动构造函数传入的参数是一个右值 用&&标出。一般来说左值可以通过使用std:move
方法强制转换为右值。移动构造函数首先将传递参数的内存地址空间接管,然后将内部所有指针设置为nullptr,并且在原地址上进行新对象的构造,最后调用原对象的的析构函数,这样做既不会产生额外的拷贝开销,也不会给新对象分配内存空间。
拷贝构造:申请->复制->释放原空间。拷贝构造函数是先将传入的参数对象进行一次深拷贝,再传给新对象。这就会有一次拷贝对象的开销,并且进行了深拷贝,就需要给对象分配地址空间。
移动构造函数就是为了解决这个拷贝开销而产生的。
9、操作数据的方法
1、重载运算符[]
deque<int> data(5, 2);int a = data[3]; //2
int b = data[5]; //0
int c = data[128]; //错误
可以看到,容器名[n]的这种方式,不仅可以访问容器中的元素,还可以对其进行修改。但需要注意的是,使用此方法需确保下标 n 的值不会超过容器中存储元素的个数,否则会发生越界访问的错误。
同时,如果某个缓冲区有未使用的空间,访问这些空间不会造成程序错误,只会返回一个不确定的值。
2、at()
有效地避免越界访问,由于该函数会返回容器中指定位置处元素的引用形式,因此利用该函数的返回值,既可以访问指定位置处的元素,如果需要还可以对其进行修改。
at() 成员函数会自行判定访问位置是否越界,如果越界则抛出std::out_of_range
异常。
deque<int> data(5, 2);
std::cout << data.at(2) << endl;//std::cout << data.at(5) << endl; std::out_of_range
3、front()和back()
它们分别返回 deque容器中第一个和最后一个元素的引用,通过利用它们的返回值,可以访问(甚至修改)容器中的首尾元素。
deque<int> data(5, 2);
std::cout << data.front() << endl;
std::cout << data.back() << endl;
3、push、pop、insert
成员函数 | 功能 |
---|---|
push_back() | 在容器现有元素的尾部添加一个元素 |
pop_back() | 移除容器尾部的一个元素 |
push_front() | 在容器现有元素的头部添加一个元素 |
pop_front() | 移除容器尾部的一个元素 |
emplace_back() | C++11 新添加的成员函数,其功能是在容器尾部生成一个元素 |
emplace_front() | C++ 11 新添加的成员函数,其功能是在容器头部生成一个元素 |
insert() | 在指定的位置直接生成一个元素。 |
emplace() | C++ 11 新添加的成员函数,其功能是 insert() 相同,即在指定的位置直接生成一个元素。 |
push_back() 和push_front() 都是给容器中插入数据,不同的事一个是插在容器的尾部,一个则是插在容器的头部。
void push_back(const value_type& __t) {if (_M_finish._M_cur != _M_finish._M_last - 1) {construct(_M_finish._M_cur, __t);++_M_finish._M_cur;}else_M_push_back_aux(__t);
}void push_back() {if (_M_finish._M_cur != _M_finish._M_last - 1) {construct(_M_finish._M_cur);++_M_finish._M_cur;}else_M_push_back_aux();
}
上面是push_back函数的原型。push_front则差不多的。
insert方法的实现跟其他容器的都差不多。主要有4种方法。
语法格式 | 功能 |
---|---|
iterator insert(pos, elem) | 在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。 |
iterator insert(pos, n, elem) | 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos, first, last) | 在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos, initlist) | 在迭代器 pos 指定的位置之前,插入初始化列表中所有的元素,并返回表示第一个新插入元素位置的迭代器。 |
std::deque<int> data {1, 2};
//第一种格式用法
data.insert(data.begin() + 1, 3); //{1, 3, 2}//第二种格式用法
data.insert(data.end(), 2, 5); //{1, 3, 2, 5, 5}//第三种格式用法
std::array<int, 3> array{ 7, 8, 9 };
data.insert(data.end(), array.begin(), array.end()); //{1, 3, 2, 5, 5, 7, 8, 9 }//第四种格式用法
data.insert(data.end(), { 10,11 }); //{1, 3, 2, 5, 5, 7, 8, 9, 10, 11 }
4、为什么要有emplace系列的函数
emplace系列的函数是在C++11之后才添加的,主要是因为引入了移动构造可以减少开销。具体的内容与std::map的emplace系列函数是一样的操作。测试用例也差不多。如果有兴趣,请看上一篇《两小时带你从0学习stl库–map》第九节并自行测试。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Linux静态库和动态库
Linux静态库和动态库静态库动态库两个版本动态库本文章介绍Linux的静态库和动态库,以及两个版本动态库的处理。文件main.c: #include <stdio.h> #include <add.h> #include <sub.h>int main() {int res 0;int a 3, b 2;res add(a…...
2024/5/8 13:54:21 - conda环境分享
共享conda环境原文参考:链接 在第一台电脑的conda环境中,在terminal中输入如下命令,将环境中的所有package都倒入到 pkgs.txt: conda list --explicit > pkgs.txt在第二台电脑的terminal输入如下命令,创建一个名叫…...
2024/5/8 13:54:21 - 一次线上测试环境jvm oom故障排查
# 排查参考文章: https://blog.csdn.net/fly910905/article/details/90179225 # 理解Linux oom https://blog.csdn.net/run_for_belief/article/details/83446344 # jvm oom 八种原因和排查 https://blog.csdn.net/fly910905/article/details/90179225 # 理…...
2024/5/5 15:19:29 - Storm-实时计算系统
Storm-实时计算系统 作者 | WenasWei 一 Storm1.1 Storm简介 Storm 最早是由 BackType 公司开发的实时处理系统,底层由 Clojure 实现。Clojure 也是一门基于 JVM 的高级面向函数式的编程语言。2011年 Twitter 公司收购了 BackType 公司,便使用 Storm 帮…...
2024/5/8 13:54:19 - 代理ARP(Proxy ARP)实验
1、测试R2 ping R3,观察ARP表。 配置命令: R2#configure terminal R2(config)#no ip routing //关闭路由 R2(config)#interface fastEthernet 0/0 R2(config-if)#ip address 12.12.12.2 255.255.255.0 R2(config-if)#no shutdown R2(config-if)#exit R2(con…...
2024/5/8 13:54:18 - 二十一. 用户注册模块 --- 登录 2021-04-18
二十一. 用户注册模块 — 登录 注:该篇文章接上一篇 二十.用户注册 — 实现注册功能 在上一篇文章我们实现了用户注册中的实现注册功能,在这一章实现登录功能 一、功能需求分析 登录退出功能分析 功能 登录页面登录功能退出功能 二、登录页面 1. 接…...
2024/5/8 13:54:17 - acm选修课——贪心技术
acm选修课——贪心技术贪心技术简介案例1:桥案例2:安放雷达案例3:合并果子(相当于哈夫曼树,哈夫曼编码)案例4:判断一个数是否可以分解为阶乘和贪心技术简介 局部解是最终解的一部分 在这个基础…...
2024/5/8 13:54:17 - Selenium3自动化学习(一)
学习笔记- Selenium[səˈliːniəm] 笔记目录:https://blog.csdn.net/weixin_42717928/article/details/114343085 自动化测试了解测试环境搭建一:自动化测试了解 传统的自动化测试可以理解是基于UI层的自动化测试,将黑盒测试转化为由程序…...
2024/5/8 13:54:16 - centos7搭建代理服务器tinyproxy
环境: centos7 tinyproxy 下载tinyproxy yum install tinyproxy -y修改配置 vim /etc/tinyproxy/tinyproxy.conf# 端口 Port 8888 # 允许访问的ip,后面接允许的ip,比如我只需要我阿里云的公网ip能访问就行,于是用阿里云公网ip替…...
2024/5/8 13:54:14 - 谷歌语法总结
**site:**可以限制你搜索范围的域名.例如:学院 site:pku.edu.cn **inurl:**用于搜索网页上包含的URL,这个语法非常的重要,使用的也是最为频繁,我们还可以使用allinurl来更加精确的定位URL地址。比如搜索含有…...
2024/5/8 13:54:13 - windows下运行TCL脚本程序
首先安装环境,ActiveTcl8.3.4.1-9.win32-ix86.exe下载 1:下载windows版本 不方便UNIX/LINUX,所以直接下载windows版本,现在版本已经到8.5了; 下载链接: [url]http://www.activestate.com/Products/Download/Downlo…...
2024/5/8 11:32:52 - 使用MediaInfo.dll获取是媒体文件信息
MediaInfo是一款专门用来分析音视频文件编码和内容信息的开源软件,提供的形式有多种:桌面应用程序,命令行下的使用,动态库。 动态库的下载方式: 官网地址MediaInfo 下载完成之后解压后有一下文件,主要用的东西在Me…...
2024/5/8 13:54:11 - macos mtr
brew install mtrcd /usr/local/Cellar/mtr/0.94/sbincp mtr /usr/local/bin cp mtr-packet /usr/local/binmtr --version mtr 0.94sudo mtr baidu.com参考: MTRmacOS 安装 MTR 教程...
2024/5/8 13:54:11 - Python高级
装饰器多线程生成器、迭代器...
2024/5/8 13:54:10 - Makefile基本用法 一眼懂版
1.基本格式 示例: led.bin:leds.sarm-linux-gnueabihf-gcc -g -c leds.s -o led.oarm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.dis clean:rm -…...
2024/5/8 13:54:09 - 【ACWing】1137. 选择最佳线路
题目地址: https://www.acwing.com/problem/content/1139/ 有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具…...
2024/5/8 13:54:07 - 学习笔记:GAMES101图形学入门闫令琪(四)光栅化(一)
屏幕: 一个二维数组 数组中每一个元素是个像素 一种典型的光栅成像设备 光栅化: 把东西画在屏幕上的过程 像素 now 像素是一个颜色均匀的小正方形 颜色由RGB表示 屏幕空间: 屏幕上建立一个坐标系 像素中心的位置实际是: 在上…...
2024/5/8 13:54:06 - Mongo DB
Mongo 是 humongous 的中间部分,寓意海量数据库,Mongodb是一款非关系型/NoSQL数据库 集合与文档 集合Collection位于单独的一个数据库MongoDB文档Document集合,它类似关系型数据库(RDBMS)中的表Table。一个集合Collection内的多个…...
2024/5/8 13:54:05 - Apple4.21春季新品发布会
Apple Card Family Apple 播客更新 iPhone 12 12mini新配色 purple 查找功能 AirTag 可以定制 精确查找 借助U1芯片 $29 $99 Apple TV TV首发 Ted Lasso 第二季 Apple TV 4K A12芯片 高帧率HDR视频 色彩平衡功能,调节电视色彩,利用手机传感器 全新Siri…...
2024/5/8 13:54:05 - 简单笔记:记一次 golang 的切片复制
常规情况下 golang 的一维数组复制,可以这样写: func copy(src []int) []int {copy0 : make([]int, len(src))copy(copy0, src)return copy0 } 这样写,会新开辟一块内存空间,对切片副本的任何修改操作,不会影响原切片…...
2024/5/8 13:54:04
最新文章
- 分红76.39亿,分红率再创新高,成长活力无限的伊利带来丰厚回报
伊利47万股东,又等来了一个好消息。 4月29日,伊利股份发布2023年报,实现营业总收入1261.79亿元,归母净利润104.29亿元,双创历史新高,实现连续31年稳健增长。 在递交亮眼成绩单的同时,乳业巨头伊…...
2024/5/9 6:00:44 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - 实现窗口拖拽移动
import Vue from "vue"; /* * 定义公共js里,在入口文件main.js中import; * 给elementUI的dialog上加上 v-dialogDrag 指令就可以实现弹窗的全屏和拉伸了。 */ // v-dialogDrag: 弹窗拖拽水平方向伸缩 Vue.directive(dialogDrag, { bind(e…...
2024/5/9 4:49:44 - 零代码编程:用kimichat将PDF自动批量分割成多个图片
有一个PDF文件,现在想把pdf文件转换成图片, 可以在kimichat中输入提示词: 你是一个Python编程专家,要完成一个将PDF文件自动批量分割成多个图片的任务,具体步骤如下: 打开d盘下的pdf文件:Ill …...
2024/5/6 15:24:21 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/8 19:32:33 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/7 22:31:36 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/9 2:44:26 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/8 20:33:13 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/9 3:15:57 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/9 5:40:03 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/7 14:58:59 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/8 20:58:56 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/9 1:35:21 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/9 4:12:16 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/7 16:05:05 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/8 18:06:50 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/8 1:37:32 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/9 1:42:21 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/9 5:02:59 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/9 4:31:45 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/8 12:44:41 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/8 9:51:44 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/8 1:37:29 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/9 4:33:29 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57