Redian新闻
>
请问哪一款电动牙刷比较好?谢谢,不知道有没有发错版 (转载)
avatar
请问哪一款电动牙刷比较好?谢谢,不知道有没有发错版 (转载)# Living
r*k
1
implement copy on write string class in c++
avatar
q*e
2
【 以下文字转载自 Medicine 讨论区 】
发信人: queque (queque), 信区: Medicine
标 题: 请问哪一款电动牙刷比较好?谢谢,不知道有没有发错版
发信站: BBS 未名空间站 (Sun Oct 23 20:10:15 2011, 美东)
请教一下哪一款电动牙刷大家觉得比较好用,能刷的比较干净。常见的就是oral-b和Philips Sonicare,不知道哪一个型号的最好。多谢推荐,谢谢!要是
发错版面的话,请问应该到哪个版去问?
avatar
s*n
3
就是写两个overload吧?
COWString& operator=(const char*)
COWString& operator=(const COWString&)
avatar
e*t
4
只用过sonicare,还没有理由换它。

Philips Sonicare,不知道哪一个型号的最好。多谢推荐,谢谢!要是

【在 q****e 的大作中提到】
: 【 以下文字转载自 Medicine 讨论区 】
: 发信人: queque (queque), 信区: Medicine
: 标 题: 请问哪一款电动牙刷比较好?谢谢,不知道有没有发错版
: 发信站: BBS 未名空间站 (Sun Oct 23 20:10:15 2011, 美东)
: 请教一下哪一款电动牙刷大家觉得比较好用,能刷的比较干净。常见的就是oral-b和Philips Sonicare,不知道哪一个型号的最好。多谢推荐,谢谢!要是
: 发错版面的话,请问应该到哪个版去问?

avatar
q*c
5
什么叫copy on write? 不懂这个,那一电面不歇菜了? 不是说F止考算法和数据结构吗
?
avatar
q*e
6
多谢推荐,请问哪一个型号的好?

【在 e********t 的大作中提到】
: 只用过sonicare,还没有理由换它。
:
: Philips Sonicare,不知道哪一个型号的最好。多谢推荐,谢谢!要是

avatar
r*b
7
I think that it is more complex that this. We need to consider both updating
the whole string, and updating one character in the string.
Here is what I thought about the implementation:
http://basicalgos.blogspot.com/2012/03/16-implement-copy-on-wri

【在 s******n 的大作中提到】
: 就是写两个overload吧?
: COWString& operator=(const char*)
: COWString& operator=(const COWString&)

avatar
e*t
8
只用过essence。

【在 q****e 的大作中提到】
: 多谢推荐,请问哪一个型号的好?
avatar
S*y
9
Re
avatar
m*s
10
Flexcare plus

【在 q****e 的大作中提到】
: 多谢推荐,请问哪一个型号的好?
avatar
p*2
11
不懂呀。
avatar
k*o
12
Philips Sonicare的,洗牙牙医都说不错
avatar
s*n
13
觉得那个不太好,用share pointer:
class COWString {
share_ptr data;
public:
COWString(const char* input)
{
data = share_ptr(new CString(input));
}
COWString(const COWString& str)
{
data = str.data;
}
COWString& operator=(const COWString& str)
{
data = str.data;
return *this;
}
COWString& SetAt(int index, char c)
{
CString* newStr = new CString(data->c_str());
newStr->SetAt(index, c);
data = share_ptr(newStr);
return *this;
}
char GetAt(int index) const
{
return data->GetAt(index);
}
}

updating

【在 r*****b 的大作中提到】
: I think that it is more complex that this. We need to consider both updating
: the whole string, and updating one character in the string.
: Here is what I thought about the implementation:
: http://basicalgos.blogspot.com/2012/03/16-implement-copy-on-wri

avatar
q*e
14
多谢多谢,哪里买会便宜些

【在 k******o 的大作中提到】
: Philips Sonicare的,洗牙牙医都说不错
avatar
h*g
15
写了一个,有错误请指正~~
//copy on write
class String
{
private:
char *str;
int len;
public:
String():str(0),len(0)
{

}
String(char *p)
{
len=strlen(p);
char *tm=new char(len+2);
memset(tm,0,len+2);
str=tm+1;
strncpy(str,p,len+1);
}
String(const String &ms)
{
len=ms.len;
str=ms.str;
++(str[-1]);
}
String & operator =(const String &ms)
{
ms.str[-1]++;
descUse();
str=ms.str;
len=ms.len;
return *this;
}
void descUse()
{
str[-1]--;
if(str[-1]==-1)
{
delete str;
str=NULL;
len=0;
}
}
char & opeator[](int idx)
{
if(idx<0||idx>len)
{
return NULL;
}
if(str[-1]>0)
{
char *tmp=new char(len+2);
memset(tmp,0,len+2);
strncpy(tmp+1,str,len+1);
str[-1]--;
str=tmp+1;
}
return str[idx];
}
~String()
{
descUse();
}
};

【在 r*****k 的大作中提到】
: implement copy on write string class in c++
avatar
q*e
16
谢谢谢谢,看了一下,review都很好,169刀,请问哪里买会便宜些?

【在 m****s 的大作中提到】
: Flexcare plus
avatar
s*n
17
你这等于实现了一个share_ptr

【在 h*****g 的大作中提到】
: 写了一个,有错误请指正~~
: //copy on write
: class String
: {
: private:
: char *str;
: int len;
: public:
: String():str(0),len(0)
: {

avatar
q*e
18
是这一型号吧
Philips Sonicare FlexCare Plus HX6972/10, Rechargeable Toothbrush

【在 m****s 的大作中提到】
: Flexcare plus
avatar
r*k
19
阿三面的
implement copy on write string class in c++
avatar
s*g
20
如果有家庭,可以在costco买,一下子两支牙刷,2个充电器那种sonicare。有时候有30 0ff的
哭胖。

Philips Sonicare,不知道哪一个型号的最好。多谢推荐,谢谢!要是

【在 q****e 的大作中提到】
: 是这一型号吧
: Philips Sonicare FlexCare Plus HX6972/10, Rechargeable Toothbrush

avatar
s*n
21
就是写两个overload吧?
COWString& operator=(const char*)
COWString& operator=(const COWString&)
avatar
q*c
22
什么叫copy on write? 不懂这个,那一电面不歇菜了? 不是说F止考算法和数据结构吗
?
avatar
r*b
23
I think that it is more complex that this. We need to consider both updating
the whole string, and updating one character in the string.
Here is what I thought about the implementation:
http://basicalgos.blogspot.com/2012/03/16-implement-copy-on-wri

【在 s******n 的大作中提到】
: 就是写两个overload吧?
: COWString& operator=(const char*)
: COWString& operator=(const COWString&)

avatar
S*y
24
Re
avatar
p*2
25
不懂呀。
avatar
s*n
26
觉得那个不太好,用share pointer:
class COWString {
share_ptr data;
public:
COWString(const char* input)
{
data = share_ptr(new CString(input));
}
COWString(const COWString& str)
{
data = str.data;
}
COWString& operator=(const COWString& str)
{
data = str.data;
return *this;
}
COWString& SetAt(int index, char c)
{
CString* newStr = new CString(data->c_str());
newStr->SetAt(index, c);
data = share_ptr(newStr);
return *this;
}
char GetAt(int index) const
{
return data->GetAt(index);
}
}

updating

【在 r*****b 的大作中提到】
: I think that it is more complex that this. We need to consider both updating
: the whole string, and updating one character in the string.
: Here is what I thought about the implementation:
: http://basicalgos.blogspot.com/2012/03/16-implement-copy-on-wri

avatar
h*g
27
写了一个,有错误请指正~~
//copy on write
class String
{
private:
char *str;
int len;
public:
String():str(0),len(0)
{

}
String(char *p)
{
len=strlen(p);
char *tm=new char(len+2);
memset(tm,0,len+2);
str=tm+1;
strncpy(str,p,len+1);
}
String(const String &ms)
{
len=ms.len;
str=ms.str;
++(str[-1]);
}
String & operator =(const String &ms)
{
ms.str[-1]++;
descUse();
str=ms.str;
len=ms.len;
return *this;
}
void descUse()
{
str[-1]--;
if(str[-1]==-1)
{
delete str;
str=NULL;
len=0;
}
}
char & opeator[](int idx)
{
if(idx<0||idx>len)
{
return NULL;
}
if(str[-1]>0)
{
char *tmp=new char(len+2);
memset(tmp,0,len+2);
strncpy(tmp+1,str,len+1);
str[-1]--;
str=tmp+1;
}
return str[idx];
}
~String()
{
descUse();
}
};

【在 r*****k 的大作中提到】
: 阿三面的
: implement copy on write string class in c++

avatar
s*n
28
你这等于实现了一个share_ptr

【在 h*****g 的大作中提到】
: 写了一个,有错误请指正~~
: //copy on write
: class String
: {
: private:
: char *str;
: int len;
: public:
: String():str(0),len(0)
: {

avatar
l*y
29
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class Counter {
public :
Counter() {
counter = 0;
}
void increment() {
counter++;
}
void decrement() {
counter --;
}
int getValue() {
return counter;
}
private:
int counter;
};
class COWString {
public:
COWString() {
pointer = NULL;
rc = new Counter();
}
COWString(string& s) {
pointer = new string(s);
rc = new Counter();
rc->increment();
}
COWString(const COWString& cows) {
pointer = cows.pointer;
rc = cows.rc;
rc->increment();
}
COWString(COWString* const & cows) {
pointer = cows->pointer;
rc = cows->rc;
rc->increment();
}
COWString& operator= (const COWString& rhs) {
if (this == & rhs) {
return *this;
}
pointer = rhs.pointer;
rc = rhs.rc;
rc->increment();
return *this;
}
~COWString() {
rc->decrement();
if (rc->getValue() == 0) {
delete pointer;
delete rc;
}
}
char charAt(int index) {
return pointer->at(index);
}
void set(int index, char c) {
string* newpointer = new string(*pointer);
Counter* newrc = new Counter();
rc->decrement();
if (rc->getValue() == 0) {
delete pointer;
delete rc;
}
newpointer->at(index) = c; //问题//
newrc->increment();
pointer = newpointer;
rc = newrc;
}
string getData() {
return *pointer;
}
Counter* getCounter() {
return rc;
}
private:
string* pointer;
Counter* rc;
};
int main() {
string input = "hello world!";
COWString* s = new COWString(input);
COWString* copy = new COWString(const_cast (s));
cout << s->getData() << endl;
cout << s->getCounter()->getValue() << endl;
cout << copy->getData() << endl;
cout << copy->getCounter()->getValue() << endl;
copy->set(0, 'H');
cout << s->getData() << endl;
cout << s->getCounter()->getValue() << endl;
cout << copy->getData() << endl;
cout << copy->getCounter()->getValue() << endl;
return 0;
}
我也写了一个。 顺便问一个问题,在程序中为什么
newpointer->at(index) = c;
改成
newpointer[index] = c之后,结果就不对了。 谢谢!
avatar
C*U
30
溢出?
[] 不检查range at会检查

【在 l*********y 的大作中提到】
: #include
: #include
: #include
: #include
: #include
: #include
: #include
: using namespace std;
: class Counter {
: public :

avatar
w*x
31
明显的刁难嘛(除非楼主简历上写了会这个), 大家就别讨论了
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。