自定义String类,并且实现在STL容器中添加自定义的类型

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 13.44 编写标准库string类的简化版本,命名String。你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数。使用allocator为你的String类分配所需内存。 13.47 添加拷贝构造函数和拷贝赋值运算符,并添加打印语句,则每次函数执行时打印一条信息。

13.44 编写标准库string类的简化版本,命名String。你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数。使用allocator为你的String类分配所需内存。

13.47 添加拷贝构造函数和拷贝赋值运算符,并添加打印语句,则每次函数执行时打印一条信息。

13.48 定义一个vector<String>并在其上多次调用push_back。运行程序,观察String被拷贝了多少次。

#include<iostream>
#include<string>
#include<memory>
#include<utility>
#include<cstring>
#include<vector>
using namespace std;

class String
{
public:
    String()=default;
    String(char *c);
    String(const String&);
    String& operator=(const String&);
    string* begin() const { return elements;}
    string* end() const { return first_free;}
private:
    static allocator<string> alloc;
    string *elements;
    string *first_free;
};

allocator<string> String::alloc;
String::String(char *c)
{
    size_t capacity=strlen(c);
    auto data=alloc.allocate(capacity);
    auto dest=data;
    string s;
    s.copy(c,strlen(c));
    alloc.construct(dest++,s);
    elements=data;
    first_free=dest;
}

String::String(const String &s)
{
    cout<<"copy construct"<<endl;
    auto capacity=s.end()-s.begin();
    auto data=alloc.allocate(capacity);
    uninitialized_copy(s.begin(),s.end(),data);
    elements=data;
    first_free=data+capacity;
}

String& String::operator=(const String &s)
{
    cout<<"copy = construct"<<endl;
    auto capacity=s.end()-s.begin();
    auto data=alloc.allocate(capacity);
    uninitialized_copy(s.begin(),s.end(),data);
    if(elements)
    {
        auto begin=elements;
        auto end=first_free;
        while(begin!=end)
            alloc.destroy(begin++);
        alloc.deallocate(elements,first_free-elements);
    }
    elements=data;
    first_free=data+capacity;
    return *this;
}
int main()
{
    vector<String> vec;
    char ch[]="hello";
    char ch1[]="world!";
    cout<<vec.capacity()<<endl;
     cout<<endl;
    vec.push_back(String(ch));
    cout<<vec.capacity()<<endl;
    cout<<endl;
    vec.push_back(String(ch1));
    cout<<vec.capacity()<<endl;
    cout<<endl;
    vec.push_back(String(ch));
    cout<<vec.capacity()<<endl;
    cout<<endl;
    vec.push_back(String(ch1));
    cout<<vec.capacity()<<endl;
    cout<<endl;
    vec.push_back(String(ch1));
    cout<<vec.capacity()<<endl;
    cout<<endl;
    vec.push_back(String(ch1));
    cout<<vec.capacity()<<endl;
    return 0;
}

运行结果:

解释:http://blog.csdn.net/HEYUTAO007/article/details/6702626

相关文章
|
27天前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
28 0
|
19天前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
21天前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何将STRING类型转换为DATETIME类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
14天前
|
存储 NoSQL 索引
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
|
15天前
|
开发工具 数据安全/隐私保护
【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
|
19天前
|
存储 容器
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
12 0
|
19天前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
29 0
|
25天前
|
数据采集 监控 Kubernetes
Job类日志采集问题之iLogtail以减小容器发现和开始采集的延时如何优化
Job类日志采集问题之iLogtail以减小容器发现和开始采集的延时如何优化
|
25天前
|
数据采集 Kubernetes Java
Job类日志采集问题之在日志中添加容器的元信息标签,如何操作
Job类日志采集问题之在日志中添加容器的元信息标签,如何操作
|
25天前
|
存储 Kubernetes 数据处理
Job类日志采集问题之为什么Job容器的日志采集要考虑容器发现速度和开始采集延时,如何理解
Job类日志采集问题之为什么Job容器的日志采集要考虑容器发现速度和开始采集延时,如何理解