void test03()
{
for (size_t i = 0; i < 100; ++i, cout << i << " ");
cout << endl;
for (size_t i = 0; i < 100; ++++i, cout << i << " ");
cout << endl;
for (size_t i = 0; i < 100; ++++++++i, cout << i << " ");
cout << endl;
}
- iterator start; //表示使用空间的头
- iterator finish; //表示使用空间的尾
- iterator end_of_storage; //表示可用空间的尾
vector空间配置测试
void test004()//vector空间配置测试
{
vector<size_t>v;
for (size_t i = 0; i < 100; i++)
{
v.push_back(i);
cout << "size=" << v.size() << " capacity=" << v.capacity() <<" 202206 2710778 size_t(&v[0])="<< size_t(&v[0]) << " &v[i]=" << size_t(&v[i]) << endl;
}
}</code></pre><p><span><img src=" https: img2022.cnblogs.com blog 2710778-20220626185448233-511896699.png"><p></p><p><span>STL内置的扩容策略,每次扩容,就会开辟新的内存空间;</span></p><pre class="language-cpp highlighter-hljs"><code> _CONSTEXPR20_CONTAINER size_type _Calculate_growth(const size_type _Newsize) const {
// given _Oldcapacity and _Newsize, calculate geometric growth
const size_type _Oldcapacity = capacity();
const auto _Max = max_size();
//如果按原容量1.5倍的方式增加容量,超过了最大容量,则返回最大容量
if (_Oldcapacity > _Max - _Oldcapacity / 2) {
return _Max; // geometric growth would overflow
}
const size_type _Geometric = _Oldcapacity + _Oldcapacity / 2;
//如果增加一般的容量小于新容量,则返回新容量
if (_Geometric < _Newsize) {
return _Newsize; // geometric growth would be insufficient
}
//否则,按照1.5倍的方式增加容量
return _Geometric; // geometric growth is sufficient
}</code></pre><ul><li><span>常迭代器constant iterator</span></li><li><span>可变迭代器mutable iterator</span></li></ul><p><span>常用的五种型别:</span></p><p><span>typedef typename T::iterator_category iterator_category;//迭代器型别</span></p><p><span>typedef typename T::value::type value_type;//值的型别</span></p><p><span>typedef typename T::difference_type defference_type;//差值、距离型别</span></p><p><span>typedef typename T::pointer pointer;//指针型别</span></p><p><span>typedef typename T::reference reference;//引用型别</span></p><p></p><p><span><strong>POD(数据结构) -plain old data 的缩写(POD)一个<span>普通的古老的</span>数据结构(POD)是一种数据结构。</strong></span></p><p><span><strong>POD类型=标量类型scalar type+传统C结构体类型C struct type</strong></span></p><p><span><strong>标量类型(Scalar type)</strong></span></p><p><span><strong>集合/复合类型aggregate/compound type</strong></span></p><p><span><strong>(ISO C11 §6.2.5)</strong></span></p><p><span><strong>Arithmetic types(算术类型) and pointer types(指针类型) are collectively(共同的) called scalar types.</strong></span></p><p></p><p><span><strong>Array(数组) and structure(结构体) types are collectively called aggregate types.</strong></span></p><p></p><p><span><strong>在C语言中,整数类型(int、short、long等)、字符类型(char、wchar_t等)、枚举类型(enum)、小数类型(float、double等)、布尔类型(bool)都属于标量类型,一份标量类型的数据只能包含一个值。</strong></span></p><p><span><strong>结构体(struct)、数组、字符串都属于复合类型,一份复合类型的数据可以包含多个标量类型的值,也可以包含其他复合类型的值。</strong></span></p><p><span><strong>STL中的空间配置器allocator工作流程</strong></span></p><p></p><p><span><strong>C++17的结构化绑定</strong></span></p><p><span><strong>首先设置语言标准为C++17标准(或更高的版本),才支持结构化绑定</strong></span></p><p></p><pre class="language-cpp highlighter-hljs"><code>#include<sstream>
struct Point
{
double x, y;
string toString()
{
stringstream s;
s <<'(' 2 202206 2710778 << x ','<< y<< ')'; return s.str(); } }; point midpoint(const point& p1, const p2) { (p1.x + p2.x) 2, (p1.y p2.y) void test001() p1(1.6,2),p2(3,4.4); cout <<"p1=" << p1.toString() <<" p2="<< p2.toString() <<" mdiddlepoint="<< midpoint(p1, p2).toString() << endl;
}</code></pre><p><span><strong><img src=" https: img2022.cnblogs.com blog 2710778-20220625165726377-1849211280.png"><p></p><pre class="language-cpp highlighter-hljs"><code>void test1()
{
Student s1(18, "Tom");
auto [age, name] = s1;
cout << "age=" << age << "name=" << name << endl;
}
void test2()
{
vector<student> sv= { Student(18,"Tom"),Student(20,"Jack"),Student(23,"Clark") };
Student s[] = { Student(18,"Tom"),Student(20,"Jack"),Student(23,"Clark") };
for (const auto[age, name] : sv)
{
cout << "age=" << age << "name=" << name << endl;
}
}</student></code></pre><p></p><p></p><p><span><strong>函数set_new_handler</strong></span></p><p><span><strong>函数说明</strong></span></p><ul><li><span><strong>set_new_handler函数的作用是设置new_p指向的函数为<span>new操作或new[]操作失败时调用的处理函数</span>。</strong></span></li><li><span><strong>设置的处理函数可以尝试使更多空间变为可分配状态,这样新一次的new操作就可能成功。当且仅当该函数成功获得更多可用空间它才会返回;否则它将抛出bad_alloc异常(或者继承该异常的子类)或者终止程序(例如调用abort或exit)。</strong></span></li><li><span><strong>如果设置的处理函数返回了(例如,该函数成功获得了更多的可用空间),它可能将被反复调用,直到内存分配成功,或者它不再返回,或者被其它函数所替代。</strong></span></li><li><span><strong>在尚未用set_new_handler设置处理函数,或者设置的处理函数为空时,将调用默认的处理函数,该函数在内存分配失败时抛出bad_alloc异常。</strong></span></li></ul><p><span><strong>参数说明</strong></span></p><p><span><strong>new_p:该函数指针所指的函数应为空参数列表且返回值类型为void</strong></span></p><p><span><strong>该函数可以尝试获得更多的可用空间,或者抛出异常,或者终止程序。</strong></span></p><p><span><strong>如果是一个空指针,处理函数将被重置为默认值(将会执行抛出bad_alloc异常)。</strong></span></p><p><span><strong>返回值</strong></span></p><p><span><strong>返回先前被设置的处理函数指针;如果尚未被设置或者已被重置,将返回空指针。</strong></span></p><p><span><strong>返回的函数指针是无参的void返回值类型的函数指针。</strong></span></p><p><span><strong>placement new 是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。</strong></span></p><p><span><strong>以_ t结尾的这些数据类型被称为<span>原始系统数据类型</span>。</strong></span></p><p><span><strong>它是为了方便系统之间的<span>移植(跨平台)</span>而定义的</strong></span></p><p><span><strong>size_t 数据类型</strong></span></p><p><span><strong>size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。</strong></span></p><p><span><strong>size_t的真实类型与操作系统有关,在32位架构中被普遍定义为:</strong></span></p><p><span><strong>typedef unsigned int size_t;</strong></span></p><p><span><strong>而在64位架构中被定义为:</strong></span></p><p><span><strong>typedef unsigned long size_t;</strong></span></p><p><span><strong>size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。</strong></span></p><p><span><strong>而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数。</strong></span></p><p><span><strong>参考:size_t在WikiPedia上的词条</strong></span></p><ul><li><span><strong>size_t是无符号的,并且是<span>平台无关</span>的,表示0-MAXINT的范围;</strong></span></li><li><span><strong>int是有符号的;</strong></span></li></ul><p></p><p><span><strong>STL版本</strong></span></p><p><span><strong>HP惠普版--所有版本的始祖</strong></span></p><p><span><strong>PJ Plauger版--符号命名不规范,可读性差</strong></span></p><p><span><strong>Rouge Wave版--可读性不错</strong></span></p><p><span><strong>SGI 版--被GCC采用,可读性很好</strong></span></p><p><span><strong>STL组件</strong></span></p><p><span><strong>容器Container--储存数据</strong></span></p><p><span><strong>算法Algorithm--操作数据</strong></span></p><p><span><strong>迭代器Iterator--读写数据</strong></span></p><p><span><strong>仿函数Functor--模仿函数的类</strong></span></p><p><span><strong>适配器Adapter--修饰作用</strong></span></p><p><span><strong>空间配置器Allocator--内存管理</strong></span></p><p></p><p><span><strong>包含的越多,越泛化;</strong></span></p><p><span><strong>包含的越少,越特化</strong></span></p><p><span><strong>越子类,越特化,越父类,越泛化;</strong></span></p><p><span><strong>子类比父类更特化,父类比子类更泛化;</strong></span></p><p><span><strong>泛化:更加宽泛、更加抽象,交通工具比自行车更泛化,工作日比星期3更泛化</strong></span></p><p><span><strong>特化:更加详细、更加具体,狗比动物更具体,14点比下午更具体;</strong></span></p><p><span><strong>泛化和特化的示意图</strong></span></p><p><span><strong>partial order偏序:对不同泛化/特化化程度的函数模板进行重载排序;以防止函数调用的歧义/二义性/ambiguous</strong></span></p><p><span><strong>partial specialization 偏特化:对模板/泛型类中的参数类型进行具体化或者部分具体化;太过于泛化,不便于某些具体实现;更加具体的实现需要更加特化的参数;</strong></span></p><p><span><strong>例如实现吃Eat()方法只需【Animal动物】泛化层级的参数,而实现吃肉EatMeat()方法则需要更加特化的的参数【食肉动物carnivore】</strong></span></p><p><span><strong><span>class template partial specialization类模板偏特化</span></strong></span></p><p><span><strong><span>function template partial order偏序模板函数</span></strong></span></p><p></p></'('></sstream></code></pre></"></size_t>
Original: https://www.cnblogs.com/zhangdezhang/p/16408083.html
Author: 张德长
Title: C++学习笔记(5)–STL
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611222/
转载文章受原作者版权保护。转载请注明原作者出处!