| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 908 人关注过本帖
标题:关于动态数组的问题
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
回复 10楼 lonmaor
我看楼主不是这意思。他是根本就不想用 string 这个类。
2012-07-27 01:08
小糊涂神c30
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:198
专家分:809
注 册:2012-4-25
收藏
得分:0 
以下是引用pangding在2012-7-27 01:08:19的发言:

我看楼主不是这意思。他是根本就不想用 string 这个类。
不想用现成的,还请各位据需发挥一下自己的能力,协助完成这样的想法!
2012-07-27 08:07
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
看你思路挺清楚的,就自己写呗,也不是太难。你是什么地方有困难?
2012-07-27 11:25
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:28 
程序代码:
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

class String {
public:
    String(const char* = 0);
    String(const String&);
    ~String();

public:
    int getLength();

    String& assign(const char*);
    String& assign(const String&);
   
    String& append(const char*);
    String& append(const String&);
   
    int compare(const char*);
    int compare(const String&);
   
    String& operator=(const char*);
    String& operator=(const String&);
   
    String& operator+=(const char*);
    String& operator+=(const String&);
   
    String operator+(const char*);
    String operator+(const String&);
   
    bool operator==(const char*);
    bool operator==(const String&);
   
    bool operator!=(const char*);
    bool operator!=(const String&);
   
    bool operator>(const char*);
    bool operator>(const String&);
   
    bool operator<(const char*);
    bool operator<(const String&);
   
    friend istream& operator>>(istream&, String&);
    friend ostream& operator<<(ostream&, const String&);
private:
    int capacity;
    char* storage;
};

String::String(const char* cstr)
{
    if (cstr) {
        capacity = strlen(cstr) + 1;
        storage = new char[capacity];
        strcpy(storage, cstr);
    } else {
        capacity = 1;
        storage = new char[capacity];
        *storage = '\0';
    }
}

String::String(const String& str)
{
    capacity = str.capacity;
    storage = new char[capacity];
    strcpy(storage, str.storage);
}

String::~String()
{
    if (storage)
        delete[] storage;
}

int String::getLength()
{
    return capacity - 1;
}

String& String::assign(const char* cstr)
{
    if (storage)
        delete[] storage;
    capacity = strlen(cstr) + 1;
    storage = new char[capacity];
    strcpy(storage, cstr);
    return *this;
}

String& String::assign(const String& str)
{
    if (storage)
        delete[] storage;
    capacity = str.capacity;
    storage = new char[capacity];
    strcpy(storage, str.storage);
    return *this;
}

String& String::append(const char* cstr)
{
    capacity += strlen(cstr);
    char* newStorage = new char[capacity];
    strcpy(newStorage, storage);
    strcat(newStorage, cstr);
    delete[] storage;
    storage = newStorage;
    return *this;
}

String& String::append(const String& str)
{
    capacity += str.capacity;
    char* newStorage = new char[capacity];
    strcpy(newStorage, storage);
    strcat(newStorage, str.storage);
    delete storage;
    storage = newStorage;
    return *this;
}

int String::compare(const char* cstr)
{
    return strcmp(storage, cstr);
}

int String::compare(const String& str)
{
    return strcmp(storage, str.storage);
}

String& String::operator=(const char* cstr)
{
    return assign(cstr);
}

String& String::operator=(const String& str)
{
    return assign(str);
}

String& String::operator+=(const char* cstr)
{
    return append(cstr);
}

String& String::operator+=(const String& str)
{
    return append(str);
}

String String::operator+(const char* cstr)
{
    String tmp(*this);
    tmp.append(cstr);
    return tmp;
}

String String::operator+(const String& str)
{
    String tmp(*this);
    tmp.append(str);
    return tmp;
}

bool String::operator==(const char* cstr)
{
    return compare(cstr) == 0;
}

bool String::operator==(const String& str)
{
    return compare(str) == 0;
}

bool String::operator!=(const char* cstr)
{
    return compare(cstr) != 0;
}

bool String::operator!=(const String& str)
{
    return compare(str) != 0;
}

bool String::operator>(const char* cstr)
{
    return compare(cstr) > 0;
}

bool String::operator>(const String& str)
{
    return compare(str) > 0;
}

bool String::operator<(const char* cstr)
{
    return compare(cstr) < 0;
}

bool String::operator<(const String& str)
{
    return compare(str) < 0;
}

void inflate(char** pBuffer, int* capacity, int incr)
{
    char* newBuffer = new char[*capacity + incr];
    strncpy(newBuffer, *pBuffer, *capacity);
    delete[] *pBuffer;
    *pBuffer = newBuffer;
    *capacity += incr;
}

istream& operator>>(istream& in, String& str)
{
    int capacity = 100;
    int increment = 100;
    char* buffer = new char[capacity], ch;
    int i = 0;
    while (in.get(ch) && !isspace(ch)) {
        if (i == capacity)
            inflate(&buffer, &capacity, increment);
        buffer[i++] = ch;
    }
    if (i == capacity)
        inflate(&buffer, &capacity, 1);
    buffer[i] = '\0';
    str.assign(buffer);
    return in;
}

ostream& operator<<(ostream& out, const String& str)
{
    return out << str.storage;
}

int main()
{
    String strs[] = {
        "As long as you love me",
        "Iridescent",
        "Love story",
        "I'm yours",
        "How to break a heart"
    };
    for (int i = 0; i < sizeof strs / sizeof *strs; ++i)
        cout << strs[i] << endl;
    String str;
    cin >> str;
    cout << str << endl;
    cin >> str;
    cout << str << endl;
    cout << (strs[0] == strs[0]) << endl;
    cout << (strs[0] == strs[1]) << endl;
    cout << (strs[0] < strs[1]) << endl;
    cout << (strs[1] < strs[0]) << endl;
    cout << (strs[0] > strs[1]) << endl;
    cout << (strs[1] > strs[0]) << endl;
    strs[0] += strs[1];
    cout << strs[0] << endl;
    strs[1] += " Hello";
    cout << strs[1] << endl;
    str = strs[0] + " " + strs[1];
    cout << str << endl;
}

My life is brilliant
2012-07-27 14:05
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 14楼 lz1091914999
如果这是你以前就实现好的,我觉得发出来共享共享还好。如果是特意写的我觉得就挺亏的。楼主思路那么清楚,我又给了他提示,他就应该自己动动手。

而且你这个算法和楼主说的完全不同。你这个就是不断的 new delete 而已。而实际上,楼主那意思是,如果现在分配的内存存得下,就不应该 delete,直接用现在的就行了。扩容也应该使用倍容的技术。
其实在实现的时候也不费劲,除了 capacity 以外再多个 length 就行了。用 capacity 存开的内存长度,length 存字串长度就 OK。


[ 本帖最后由 pangding 于 2012-7-28 10:02 编辑 ]
2012-07-28 09:55
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 15楼 pangding
恩,以前写的。

My life is brilliant
2012-07-28 15:47
粉红木耳
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2012-8-5
收藏
得分:0 
完全不理解  
2012-08-05 11:02
lyp880924
Rank: 1
等 级:新手上路
威 望:1
帖 子:10
专家分:6
注 册:2012-7-7
收藏
得分:0 
#include<iostream>
using namespace std;
class Vector{
   T*data;
   int sz;
   int max;
 public:
   Vector(int max_size=5):sz(0),data(0),max(max_size) {
        data=new T[max];
   }
 ~Vector(){delete[]data;}
  Vector(const Vector&v){
    sz=v.sz;
    max=v.max;
    data=new T[v.max];
    for(int i=0;i<sz;i++){
        data[i]=v.data[i];
    }
  }
 void expand(){
   max=max*2;
   T*t=new T[max];
   for(int i=0;i<sz;i++){
       t[i]=data[i];
   }
   delete []data;
   data=t;
 }
};
int main(){
 if(sz==max)
   expand();
 return 0;
}
我也是小白 写的不对的地方还请见谅 大体上可能符合你说的意思 同时往其他大牛多多指点
2012-08-05 13:11
快速回复:关于动态数组的问题
数据加载中...
 
   



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

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