| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1486 人关注过本帖
标题:按照c++primer 上的代码做了个string的类。类似vector结果编译出错
只看楼主 加入收藏
qq826647235
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2016-5-4
结帖率:63.64%
收藏
已结贴  问题点数:20 回复次数:1 
按照c++primer 上的代码做了个string的类。类似vector结果编译出错
按照c++primer 上的代码做了个string的类。类似vector结果编译出错

代码如下
程序代码:
#ifndef STRVEC_H
#define STRVEC_H

#include<string>
#include<memory>
#include<utility>

using std::string;

class StrVec{
public:
    StrVec() : top(nullptr), back(nullptr), last(nullptr) {};
    StrVec(const StrVec&);
    StrVec& operator=(const StrVec&);
    ~StrVec();
    void push_back(string&);
    void erase(); 
    size_t size() const { return back - top; }
    size_t capacity() const { return last - top; }
    string* begin() const { return top; }
    string* end() const { return last; }
private:
    string *top;
    string *back;
    string *last;
    void free();
    void reallocate();
    std::allocator<string> alloc;
    std::pair<string*,string*> alloc_n_copy(string*,string*);      //const??
    void cheak_full()
    {
        if (capacity() == size()) reallocate();
    }
};

void StrVec::push_back(string &a)
{
    cheak_full();
    alloc.construct(back++, a);
}

std::pair<string*, string*> StrVec::alloc_n_copy(string* begin, string* end)
{
    auto data = alloc.allocate(end - begin);
    return{ data, std::uninitialized_copy(begin, end, data) };
}

StrVec::StrVec(const StrVec& A)
{
    auto data = alloc_n_copy(A.begin(), A.end());
    top = data.first;
    back = last = data.second;
}

StrVec& StrVec::operator=(const StrVec& A)
{
    auto data = alloc_n_copy(A.begin(), A.end());
    free();
    top = data.first;
    back = last = data.second;
    return *this;
}

StrVec::~StrVec()
{
    free();
}
void StrVec::reallocate()
{
    auto newspace = size() ? size() * 2 : 1;
    auto view = alloc.allocate(newspace);
    auto newtop = view;
    for (auto a = top; a != back; a++)
    {
        alloc.construct(view++, std::move(*a));
    }
    free();
    top = newtop;
    back = view;
    last = top + newspace;
}

void StrVec::free()
{
    if (top)
    {
        for (auto a = top; a != back; a++)
        {
            alloc.destroy(a);
        }
        alloc.deallocate(top, capacity());
    }
}

#endif


报错是
图片附件: 游客没有浏览图片的权限,请 登录注册


感觉是
图片附件: 游客没有浏览图片的权限,请 登录注册

这段代码的错。但是感觉写的和书上差不多,并没有什么毛病。。求教到底哪里有错
2017-04-10 14:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:20 
代码的语法没问题
……<因为你贴的是图片,我没法拷贝,也没闲工夫照着图片重新一个字一个字的敲键盘>……”这句话说的是“unsafe”,而“unsafe”只是M$一家之言,是个瞎扯蛋的屁话。
要么你换用标准的C++编译器,要么按照M$的提示加上“……<因为你贴的是图片,我没法拷贝,也没闲工夫照着图片重新一个字一个字的敲键盘>……
2017-04-10 16:00
快速回复:按照c++primer 上的代码做了个string的类。类似vector结果编译出错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017793 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved