搜索
简帛阁>技术文章>C++ primer 第五版13.39代码

C++ primer 第五版13.39代码

class="jianboge_code">
class StrVec{
public:
    StrVec();                           // 构造函数
    StrVec(const StrVec&);              // 拷贝构造
    StrVec &operator=(const StrVec&);   // 拷贝赋值构造
    ~StrVec();                          // 析构函数
    void pushBack(const string &);                    // 添加元素
    size_t size(){return initEndPtr-beginPtr;};                      // 获取构造的元素个数
    size_t capacity(){return endPtr-beginPtr;};                  // 获取开辟内存空间大小
    [[nodiscard]] string *begin() const{return beginPtr;};                    // 获取构造元素的首指针
    [[nodiscard]] string *end() const{return initEndPtr;};                      // 获取构造元素的尾指针
private:
    static pair<string*, string*> allocCopy(string*, string*);  // 拷贝操作
    void free();  // 释放空间
    void reAlloc(); // 重新开辟内存
    static allocator<string> alloc;  // 用于分配对象
    string *beginPtr;  // 开辟内存首指针
    string *initEndPtr;   // 构造元素首指针
    string *endPtr;     // 开辟内存尾指针
};

allocator<string> StrVec::alloc;  // 静态变量需要类外初始化
StrVec::StrVec(): beginPtr(nullptr), initEndPtr(nullptr), endPtr(nullptr) {}

pair<string *, string *> StrVec::allocCopy(string *b, string *e) {
    auto data = alloc.allocate(e - b);  // 开辟内存
    return {data, uninitialized_copy(b, e, data)};  // 拷贝元素
}

StrVec::StrVec(const StrVec &rhs) {
    auto ptr = allocCopy(rhs.begin(), rhs.end());
    beginPtr = ptr.first;
    endPtr = initEndPtr = ptr.second;
}

StrVec &StrVec::operator=(const StrVec &rhs) {
    if (this == &rhs) return *this;
    auto ptr = allocCopy(rhs.begin(), rhs.end());  // 先开辟空间后释放
    free();
    beginPtr = ptr.first;
    endPtr = initEndPtr = ptr.second;
    return *this;
}

void StrVec::free() {
    if (beginPtr){
        for (auto ptr = initEndPtr; ptr != beginPtr ;)
            alloc.destroy(--ptr);  // 析构元素
        alloc.deallocate(beginPtr, capacity());  // 释放内存
    }
}

StrVec::~StrVec() {
    free();
}

void StrVec::pushBack(const string &str) {
    if (size() == capacity()) reAlloc();  // 内存不足是重写分配内存
    alloc.construct(initEndPtr++, str);
}

void StrVec::reAlloc() {
    auto newCapacity = size()? 2*size(): 1;
    auto newData = alloc.allocate(newCapacity);  // 分配新内存
    auto dest = newData;
    auto res = beginPtr;
    for (auto i = 0; i < size(); ++i)
        alloc.construct(dest++, move(*res++));  // 构造
    free();  // 释放原内存
    beginPtr = newData;  // 更新指针
    initEndPtr = dest;
    endPtr = newData + newCapacity;
}

 

C++Primer第五习题答案【总目录】:https://blogcsdnnet/Dust_Evc/article/details/11433412411VisualC++项目中使用的文件类型:ht
19:include<iostream>usingnamespacestd;voidmain(){inti50;intsum0;while(i>50i<100){sumsum+
591include<iostream>intmain(){usingnamespacestd;intone,two,temp,sum0;cout<<inputfirstint
目录第5章语句51简单语句52语句作用域53条件语句54迭代语句55跳转语句56try语句块和异常处理第5章语句51简单语句①使用空语句时应该加上注释,从而令读这段代码的人知道该语句是有意省略的。②别
C++primer第五)151练习章节需要有一个Sales_item类,但是给的网站找不到,直接复制下面就好咯:ifndefSALESITEM_HdefineSALESITEM_Hinclude
C++Primer类构造函数1定义:​每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。2特点:​名字与类名相同、​没有返回类型
练习11:查用你使用的编译器的文档,确定它使用的命名约定。编译并运行第2页的main程序。在Ubuntu下面使用命令行执行时,使用g++maincpp进行编译后,会得到aout执行文件,可以用ls指令
第三章习题325这个题有个小坑,一开始我做的时候输出的数都是0,原来是把++放在了迭代器后面{*(begin+(int)grade/10)++}迭代器不支持这种运算。现将自己的正确答案分享一下,望避坑
以前阅读学习C++Primer时的习题代码(当时代码风格格式比较渣):https://githubcom/liyuan989/exercise/tree/master/c%2B%2B%20primer
第1章开始练习11查阅你使用的编译器的文档,确定它所使用的命名约定。编译并运行第2页的main程序。略练习12改写程序,让它返回1。返回值1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系