On 10月18日, 下午5时12分, "怀宇范" <dugugu...@gmail.com> wrote:
> 恩。需要什么样的值操作呢?给点伪码看看。。
>
> 在07-10-18,stlf <stlflingfeit...@gmail.com> 写道:
>
>
>
> > 为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
> > Alloc>的void remove(const T& value)).
> > 现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
> > remove方法), 这样不是更麻烦吗?
> > 谢谢指教!
>
> --
> 彪悍的人生,不需要解释。
>
> bool ContactMe(person you)
> {
> if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> fanh...@mails.tsinghua.edu.cn "))return true;
> if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;
> if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com"))return
> true;
> if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
>
> if(you.DareToKiss("FuRongJJ"))
> {
> cout<<"I 服了 U"<<endl;
> return true;
> }
> if(you.GiveMeTwoTicketsFor("MayDay"))
> {
> cout<<"I love you!"<<endl;
> return true;
> }
>
> return false;
>
> }
很直接的例子:为什么vector<T, Alloc>不提供void remove(const T& value)).成员函数,而
std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!
Regards,
- oldrev
为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
Alloc>的void remove(const T& value) 方法).
现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
remove方法), 这样不是更麻烦吗?
谢谢指教!
> std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!- 隐藏被引用文字 -
>
> - 显示引用的文字 -
说得没错,但是像 vector这样的容器,为什么不提供以元素值为参数的成员函数, 这是我想问的问题。
对于删除操作:
vector提供了删除尾部元素的成员函数pop_back;
而如果要经常删一些非尾部元素,应该考虑换个容器。
这样提供以元素值为成员函数的删除操作,就没有多大意义了吧。
说得没错,但是像 vector这样的容器,为什么不提供以元素值为参数的成员函数, 这是我想问的问题。
On 10月18日, 下午5时12分, "怀宇范" <dugugu...@gmail.com > wrote:
> 恩。需要什么样的值操作呢?给点伪码看看。。
>
> 在07-10-18,stlf <stlflingfeit...@gmail.com> 写道:
>
>
>
> > 为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
> > Alloc>的void remove(const T& value)).
> > 现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
> > remove方法), 这样不是更麻烦吗?
> > 谢谢指教!
>
> --
> 彪悍的人生,不需要解释。
>
> bool ContactMe(person you)
> {
> if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> fanh...@mails.tsinghua.edu.cn "))return true;
> if(you.PhoneTo("13488810330") || you.PhoneTo ("01062778689"))return true;
> if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com"))return
> true;
> if(you.NetTo ("www.cnblogs.com/duguguiyu"))return true;
>
> if(you.DareToKiss("FuRongJJ"))
> {
> cout<<"I 服了 U"<<endl;
> return true;
> }
> if(you.GiveMeTwoTicketsFor("MayDay"))
> {
> cout<<"I love you!"<<endl;
> return true;
> }
>
> return false;
>
> }
很直接的例子:为什么vector<T, Alloc>不提供void remove(const T& value)).成员函数,而
std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!
you.Find("范怀宇"))return true;
if(you.MailTo(" dugu...@gmail.com ") || you.MailTo(" fan...@mails.tsinghua.edu.cn "))return true;
if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;
if(you.QQTo("120628812") || you.MSNTo(" dugu...@hotmail.com"))return true;
在 2007-10-18四的 17:48 -0700,stlf写道:
--
/***************************************
Live Long and Prosper
Regards,
- oldrev
***************************************/
在 2007-10-18四的 09:54 -0700,XXX123写道:
On 10月19日, 上午10时20分, "怀宇范" <dugugu...@gmail.com> wrote:
> 你要是使用vector来remove value的话是不是太低效了啊。
> 如果stl提供了这个接口,那不知内幕的人就会频繁使用这个接口,导致很低的效率。如果没有这个接口就会使得你考虑使用别的容器。这就利用库的接口引导了你的设计。
> 这就像vector里面为什么没有pop_front一样,vector不能做么?当然不是。但如果提供了肯定被很多人错误使用,导致很低的效率。
> 个人理解。。。
>
> 在07-10-18,stlf <stlflingfeit...@gmail.com> 写道:
>
>
>
>
>
> > On 10月18日, 下午5时12分, "怀宇范" <dugugu...@gmail.com> wrote:
> > > 恩。需要什么样的值操作呢?给点伪码看看。。
>
> > > 在07-10-18,stlf <stlflingfeit...@gmail.com> 写道:
>
> > > > 为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
> > > > Alloc>的void remove(const T& value)).
> > > > 现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
> > > > remove方法), 这样不是更麻烦吗?
> > > > 谢谢指教!
>
> > > --
> > > 彪悍的人生,不需要解释。
>
> > > bool ContactMe(person you)
> > > {
> > > if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> > > if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> > > fanh...@mails.tsinghua.edu.cn "))return true;
> > > if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> > true;
> > > if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com
> > "))return
> > > true;
> > > if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
>
> > > if(you.DareToKiss("FuRongJJ"))
> > > {
> > > cout<<"I 服了 U"<<endl;
> > > return true;
> > > }
> > > if(you.GiveMeTwoTicketsFor("MayDay"))
> > > {
> > > cout<<"I love you!"<<endl;
> > > return true;
> > > }
>
> > > return false;
>
> > > }
>
> > 很直接的例子:为什么vector<T, Alloc>不提供void remove(const T& value)).成员函数,而
> > std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!
>
> --
> 彪悍的人生,不需要解释。
>
> bool ContactMe(person you)
> {
> if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> fanh...@mails.tsinghua.edu.cn "))return true;
> if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;
> if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com"))return
> true;
> if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
>
> if(you.DareToKiss("FuRongJJ"))
> {
> cout<<"I 服了 U"<<endl;
> return true;
> }
> if(you.GiveMeTwoTicketsFor("MayDay"))
> {
> cout<<"I love you!"<<endl;
> return true;
> }
>
> return false;
>
> }
虽然我们在大部分使用vector的时候只希望在其尾部进行操作, 但是有时却的确希望删除其中(不是尾部)的一个元素因此产生了erase-
remove的办法,难道对vector (或deque) 而言erase-remove的效率很低吗?如果此办法效率还可以的话为什么不能将此办法
直接应用在其成员函数之中?
...不过我也感觉是出于效率和引导用户的考虑, stl容器应该提供的是效率较佳的接口。
.
在 2007-10-19五的 04:02 +0000,stlf写道:
On 10月19日, 上午10时20分, "怀宇范" <dugugu...@gmail.com > wrote:
> 你要是使用vector来remove value的话是不是太低效了啊。
> 如果stl提供了这个接口,那不知内幕的人就会频繁使用这个接口,导致很低的效率。如果没有这个接口就会使得你考虑使用别的容器。这就利用库的接口引导了你的设计。
> 这就像vector里面为什么没有pop_front一样,vector不能做么?当然不是。但如果提供了肯定被很多人错误使用,导致很低的效率。
> 个人理解。。。
>
> 在07-10-18,stlf <stlflingfeit...@gmail.com> 写道:
>
>
>
>
>
> > On 10月18日, 下午5时12分, "怀宇范" < dugugu...@gmail.com> wrote:
> > > 恩。需要什么样的值操作呢?给点伪码看看。。
>
> > > 在07-10-18,stlf <stlflingfeit...@gmail.com > 写道:
>
> > > > 为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
> > > > Alloc>的void remove(const T& value)).
> > > > 现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
> > > > remove方法), 这样不是更麻烦吗?
> > > > 谢谢指教!
>
> > > --
> > > 彪悍的人生,不需要解释。
>
> > > bool ContactMe(person you)
> > > {
> > > if( you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> > > if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> > > fanh...@mails.tsinghua.edu.cn "))return true;
> > > if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> > true;
> > > if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com
> > "))return
> > > true;
> > > if( you.NetTo("www.cnblogs.com/duguguiyu"))return true;
>
> > > if(you.DareToKiss("FuRongJJ"))
> > > {
> > > cout<<"I 服了 U"<<endl;
> > > return true;
> > > }
> > > if(you.GiveMeTwoTicketsFor("MayDay"))
> > > {
> > > cout<<"I love you!"<<endl;
> > > return true;
> > > }
>
> > > return false;
>
> > > }
>
> > 很直接的例子:为什么vector<T, Alloc>不提供void remove(const T& value)).成员函数,而
> > std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!
>
> --
> 彪悍的人生,不需要解释。
>
> bool ContactMe(person you)
> {
> if(you.GoTo("14#344, Tsinghua") && you.Find ("范怀宇"))return true;
> if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> fanh...@mails.tsinghua.edu.cn "))return true;
> if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;
> if(you.QQTo("120628812") || you.MSNTo(" dugugu...@hotmail.com"))return
> true;
> if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
>
> if(you.DareToKiss("FuRongJJ"))
> {
> cout<<"I 服了 U"<<endl;
> return true;
> }
> if(you.GiveMeTwoTicketsFor("MayDay"))
> {
> cout<<"I love you!"<<endl;
> return true;
> }
>
> return false;
>
> }
虽然我们在大部分使用vector的时候只希望在其尾部进行操作, 但是有时却的确希望删除其中(不是尾部)的一个元素因此产生了erase-
remove的办法,难道对vector (或deque) 而言erase-remove的效率很低吗?如果此办法效率还可以的话为什么不能将此办法
直接应用在其成员函数之中?
...不过我也感觉是出于效率和引导用户的考虑, stl容器应该提供的是效率较佳的接口。
.
--
彪悍的人生,不需要解释。
bool ContactMe(person you)
{
if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
if(you.MailTo(" dugu...@gmail.com ") || you.MailTo(" fan...@mails.tsinghua.edu.cn "))return true;
if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;
if(you.QQTo("120628812") || you.MSNTo("dugu...@hotmail.com"))return true;
确实很低。可以参见STL源码剖析或者是Effective STL之类的。。。
在07-10-19,stlf <stlflin...@gmail.com > 写道:
> > > if( you.NetTo ("www.cnblogs.com/duguguiyu"))return true;
>
> > > if(you.DareToKiss("FuRongJJ"))
> > > {
> > > cout<<"I 服了 U"<<endl;
> > > return true;
> > > }
> > > if(you.GiveMeTwoTicketsFor("MayDay"))
> > > {
> > > cout<<"I love you!"<<endl;
> > > return true;
> > > }
>
> > > return false;
>
> > > }
>
> > 很直接的例子:为什么vector<T, Alloc>不提供void remove(const T& value)).成员函数,而
> > std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!
>
> --
> 彪悍的人生,不需要解释。
>
> bool ContactMe(person you)
> {
> if(you.GoTo("14#344, Tsinghua") && you.Find ("范怀宇"))return true;
> if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> fanh...@mails.tsinghua.edu.cn "))return true;
> if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;
> if(you.QQTo("120628812") || you.MSNTo(" dugugu...@hotmail.com"))return
> true;
> if(you.NetTo("www.cnblogs.com/duguguiyu "))return true;
>
> if(you.DareToKiss("FuRongJJ"))
> {
> cout<<"I 服了 U"<<endl;
> return true;
> }
> if(you.GiveMeTwoTicketsFor ("MayDay"))
> {
> cout<<"I love you!"<<endl;
> return true;
> }
>
> return false;
>
> }
虽然我们在大部分使用vector的时候只希望在其尾部进行操作, 但是有时却的确希望删除其中(不是尾部)的一个元素因此产生了erase-
remove的办法,难道对vector (或deque) 而言erase-remove的效率很低吗?如果此办法效率还可以的话为什么不能将此办法
直接应用在其成员函数之中?
...不过我也感觉是出于效率和引导用户的考虑, stl容器应该提供的是效率较佳的接口。
.
--
彪悍的人生,不需要解释。
bool ContactMe(person you)
{
if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
On 10月19日, 下午4时49分, "怀宇范" <dugugu...@gmail.com> wrote:
> 确实很低。可以参见STL源码剖析或者是Effective STL之类的。。。
>
> 在07-10-19,stlf <stlflingfeit...@gmail.com> 写道:
>
>
>
>
>
> > On 10月19日, 上午10时20分, "怀宇范" <dugugu...@gmail.com> wrote:
> > > 你要是使用vector来remove value的话是不是太低效了啊。
>
> > 如果stl提供了这个接口,那不知内幕的人就会频繁使用这个接口,导致很低的效率。如果没有这个接口就会使得你考虑使用别的容器。这就利用库的接口引导了你的设计。
> > > 这就像vector里面为什么没有pop_front一样,vector不能做么?当然不是。但如果提供了肯定被很多人错误使用,导致很低的效率。
> > > 个人理解。。。
>
> > > 在07-10-18,stlf <stlflingfeit...@gmail.com> 写道:
>
> > > > On 10月18日, 下午5时12分, "怀宇范" <dugugu...@gmail.com> wrote:
> > > > > 恩。需要什么样的值操作呢?给点伪码看看。。
>
> > > > > 在07-10-18,stlf <stlflingfeit...@gmail.com> 写道:
>
> > 为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
> > > > > > Alloc>的void remove(const T& value)).
> > > > > > 现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
> > > > > > remove方法), 这样不是更麻烦吗?
> > > > > > 谢谢指教!
>
> > > > > --
> > > > > 彪悍的人生,不需要解释。
>
> > > > > bool ContactMe(person you)
> > > > > {
> > > > > if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> > > > > if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> > > > > fanh...@mails.tsinghua.edu.cn "))return true;
> > > > > if(you.PhoneTo("13488810330") || you.PhoneTo
> > ("01062778689"))return
> > > > true;
> > > > > if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com
> > > > "))return
> > > > > true;
> > > > > if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
>
> > > > > if(you.DareToKiss("FuRongJJ"))
> > > > > {
> > > > > cout<<"I 服了 U"<<endl;
> > > > > return true;
> > > > > }
> > > > > if(you.GiveMeTwoTicketsFor("MayDay"))
> > > > > {
> > > > > cout<<"I love you!"<<endl;
> > > > > return true;
> > > > > }
>
> > > > > return false;
>
> > > > > }
>
> > > > 很直接的例子:为什么vector<T, Alloc>不提供void remove(const T& value)).成员函数,而
> > > > std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!
>
> > > --
> > > 彪悍的人生,不需要解释。
>
> > > bool ContactMe(person you)
> > > {
> > > if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> > > if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> > > fanh...@mails.tsinghua.edu.cn "))return true;
> > > if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> > true;
> > > if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com
> > "))return
> > > true;
On 10月19日, 下午6时15分, "yq chen" <mephisto.760...@gmail.com> wrote:
> 主要是remove的效率太低。而且remove算法的操作全部使用的是vector的public接口,erase也是对容器操作的算法。这就说明了无论是作为类的方法或者是free
> function都是可以的。
>
> 将该功能放到vector等容器中,必然会增加该类不必要的接口复杂性(对string的批判便来自于此)。而作为free
> function,算法将能够应用于多个不同的容器,只不过书写的方法稍有变化而已。
>
> list的remove则是必然的,它是基于list特有的常数时间的操作,而通用算法不能够达到这样的要求。
>
> 在07-10-19,怀宇范 <dugugu...@gmail.com> 写道:
>
>
>
> > 确实很低。可以参见STL源码剖析或者是Effective STL之类的。。。
>
> > 在07-10-19,stlf <stlflingfeit...@gmail.com> 写道:
> > > > > > if( you.NetTo("www.cnblogs.com/duguguiyu"))return true;
> > > 虽然我们在大部分使用vector的时候只希望在其尾部进行操作, 但是有时却的确希望删除其中(不是尾部)的一个元素因此产生了erase-
> > > remove的办法,难道对vector (或deque) 而言erase-remove的效率很低吗?如果此办法效率还可以的话为什么不能将此办法
> > > 直接应用在其成员函数之中?
>
> > > ...不过我也感觉是出于效率和引导用户的考虑, stl容器应该提供的是效率较佳的接口。
>
> > > .
>
> > > --
> > > 彪悍的人生,不需要解释。
>
> > > bool ContactMe(person you)
> > > {
> > > if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
> > > if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> > > fanh...@mails.tsinghua.edu.cn "))return true;
> > > if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> > > true;
> > > if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com"))return
> > > true;
> > > if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
>
> > > if(you.DareToKiss("FuRongJJ"))
> > > {
> > > cout<<"I 服了 U"<<endl;
> > > return true;
> > > }
> > > if(you.GiveMeTwoTicketsFor("MayDay"))
> > > {
> > > cout<<"I love you!"<<endl;
> > > return true;
> > > }
>
> > > return false;
> > > }
我觉得你说得已经比较正确了, 谢谢你,谢谢大家的讨论。