有关STL的一个基本问题

23 views
Skip to first unread message
Message has been deleted

stlf

unread,
Oct 18, 2007, 5:07:21 AM10/18/07
to TopLanguage
为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
Alloc>的void remove(const T& value)).
现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
remove方法), 这样不是更麻烦吗?
谢谢指教!

怀宇范

unread,
Oct 18, 2007, 5:12:39 AM10/18/07
to pon...@googlegroups.com
恩。需要什么样的值操作呢?给点伪码看看。。

在07-10-18,stlf <stlflin...@gmail.com> 写道:



--
彪悍的人生,不需要解释。

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;
    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;
}

stlf

unread,
Oct 18, 2007, 5:28:31 AM10/18/07
to TopLanguage

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却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!

oldrev

unread,
Oct 18, 2007, 5:42:49 AM10/18/07
to pon...@googlegroups.com
stlf 写道:
> 为什么在STL中大部分容器都没有提供以元素值为参数的成员函数? 但在有些容器中又提供了元素值操作成员函数(如std::list<T,
> Alloc>的void remove(const T& value) 方法).

> 现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
> remove方法), 这样不是更麻烦吗?
> 谢谢指教!
>
> >
>
remove 算法不能删除元素,只是调整容器中元素的顺序,事实上 stl 的算法没一
个能删除容器中的元素。真正要删除容器中的元素只用通过成员函数。

Regards,
- oldrev

莫华枫

unread,
Oct 18, 2007, 7:25:06 AM10/18/07
to pon...@googlegroups.com
隐约记得这种方式是为了确保异常保证。具体的是在记不清了。好像是在meyes或sutter的书里看到的。
叫我这记性,回头查查看。

在07-10-18,stlf <stlflin...@gmail.com > 写道:
为什么在STL中大部分容器都没有提供以元素值为参数的成员函数?  但在有些容器中又提供了元素值操作成员函数(如std::list<T,
Alloc>的void remove(const T& value) 方法).
      现在这些有关值的操作大部分都让算法来处理, 然后返回该容器的Iterator让容器的成员函数来处理(例如: erase-
remove方法), 这样不是更麻烦吗?
      谢谢指教!






--
反者道之动,弱者道之用
m...@seaskysh.com
longsh...@gmail.com
http://blog.csdn.net/longshanks/

XXX123

unread,
Oct 18, 2007, 8:00:51 AM10/18/07
to TopLanguage
还有效率。STL就是要把效率低的部分让你自己来完成。

> std::list却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!- 隐藏被引用文字 -
>
> - 显示引用的文字 -

shark

unread,
Oct 18, 2007, 5:23:11 AM10/18/07
to pon...@googlegroups.com
最近看了下concetp_map,发现concept_map不能用来调整成员函数/变量。
conceptgcc的作者对此作出了回答,原文链接:http:
//groups.google.com/group/comp.lang.c++.
moderated/browse_thread/thread/9af95c63f7cb8ec7/fefd1c3bd65ec792?#fefd1c3bd65ec792
Douglas的回答要点有二:
一、实现困难
二、不利于实现封装
对于第一点,
作者也有回复,可以用typedef来解决
对于第二点,
有待斟酌,是否对所有情况,封装都那么重要?
最后,Douglas还提了一点,如果能用concept_map为内置类型如int添加成员函
数,将会是个有趣的特性。
到这里,反过来想象,假如concept_map能用于成员的修饰,那会如何?
前面的谈论中有朋友贴过一种想法,用脚本语言来实现对成员的修改。
那么,就可以在这里用mp加上concept_map实现。
另外可以简化偏特化
对一个类,如果只想对其中的几个成员做偏特化,那么只能将这个类分层,公共的
作为基类,而需要改变的成员集合在一起作为子类继承基类,然后对这个子类作偏
特化,如果基类要调用子类中某些成员,而又不想用virtual的话,就必须把整个
类的类型作为一个模板参数给基类,使得基类能通过 static_cast转换this指针到
实现类上。
但是如果concept_map能修饰成员,事情就变得很简单,通过map,轻易地refine
类,可以节省大量代码。

XXX123

unread,
Oct 18, 2007, 12:54:44 PM10/18/07
to TopLanguage
其实很简单,学习D2.0:
class A{ ... };
void do_something(const A& a,...)==a.do_something(...);

莫华枫

unread,
Oct 18, 2007, 8:30:06 PM10/18/07
to pon...@googlegroups.com
douglas的回复似乎体现了C++的一个根本问题:内置类型同用户定义类型(类)之间的差异。内置类型不是类,是不可扩展的。而concept/concept_map则是针对类的,很多操作对于内置类型无效。毕竟C++是30年前创建的语言,内置类型和用户定义类型的概念根深蒂固。
要真正使concept/concept_map完全发挥其能量,还是需要一个全新的语言体系。在这个体系中,任何类型都是平等的。甚至所有的语言要素都是平等的。

在07-10-18,shark <cplus...@gmail.com> 写道:

stlf

unread,
Oct 18, 2007, 8:48:29 PM10/18/07
to TopLanguage

说得没错,但是像 vector这样的容器,为什么不提供以元素值为参数的成员函数, 这是我想问的问题。

MingWei Jie

unread,
Oct 18, 2007, 9:04:52 PM10/18/07
to pon...@googlegroups.com
> 说得没错,但是像 vector这样的容器,为什么不提供以元素值为参数的成员函数, 这是我想问的问题。

对于删除操作:
vector提供了删除尾部元素的成员函数pop_back;
而如果要经常删一些非尾部元素,应该考虑换个容器。
这样提供以元素值为成员函数的删除操作,就没有多大意义了吧。

莫华枫

unread,
Oct 18, 2007, 9:07:13 PM10/18/07
to pon...@googlegroups.com


在07-10-19,stlf <stlflin...@gmail.com> 写道:
说得没错,但是像 vector这样的容器,为什么不提供以元素值为参数的成员函数, 这是我想问的问题。

我印象当中这是为了使erase获得nothrow保证。出处实在记不得了,正在寻找中。

shark

unread,
Oct 18, 2007, 2:15:10 PM10/18/07
to pon...@googlegroups.com
在原帖里面,提问者想通过concept_map直接refine自己的类的类成员,使其满足concept的要求,使得concept_map可以作为 一种实现增强型adapter手段(如果可以,那么实现一个mock object等将会变得容易)。
就用原帖中的例子,class foo,如果要让其满足conceptA,conceptB,conceptC,……对于成员的要求,以前就需要做相应的adapterA, adapterB,adapterC,……,然后使通过继承套在foo上面。如果能用concept_map直接修饰,则简单优美。

怀宇范

unread,
Oct 18, 2007, 10:20:56 PM10/18/07
to pon...@googlegroups.com
你要是使用vector来remove value的话是不是太低效了啊。
如果stl提供了这个接口,那不知内幕的人就会频繁使用这个接口,导致很低的效率。如果没有这个接口就会使得你考虑使用别的容器。这就利用库的接口引导了你的设计。
这就像vector里面为什么没有pop_front一样,vector不能做么?当然不是。但如果提供了肯定被很多人错误使用,导致很低的效率。
个人理解。。。

 
在07-10-18,stlf <stlflin...@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却提供? 不知道是出于什么样的考虑...一直比较疑惑, 谢谢指点!

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;

oldrev

unread,
Oct 19, 2007, 10:40:23 AM10/19/07
to pon...@googlegroups.com
怎么没有提供? push_back, pop_back 不是么? stl 容器只会提供直接支持的操
作,数组能删除任意元素吗?不能,所以 vector 没有 remove。

在 2007-10-18四的 17:48 -0700,stlf写道:

--
/***************************************
Live Long and Prosper

Regards,
- oldrev
***************************************/

oldrev

unread,
Oct 19, 2007, 10:45:58 AM10/19/07
to pon...@googlegroups.com
只有“扩展方法”还不够,还需要允许重载隐式转换操作符。

在 2007-10-18四的 09:54 -0700,XXX123写道:

stlf

unread,
Oct 19, 2007, 12:02:37 AM10/19/07
to TopLanguage


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容器应该提供的是效率较佳的接口。

.

oldrev

unread,
Oct 19, 2007, 12:26:42 PM10/19/07
to pon...@googlegroups.com
这个问题嘛,请复习数据结构与算法。

在 2007-10-19五的 04:02 +0000,stlf写道:

怀宇范

unread,
Oct 19, 2007, 3:49:39 AM10/19/07
to pon...@googlegroups.com
确实很低。可以参见STL源码剖析或者是Effective STL之类的。。。

在07-10-19,stlf <stlflin...@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;
>     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;

yq chen

unread,
Oct 19, 2007, 6:15:17 AM10/19/07
to pon...@googlegroups.com
主要是remove的效率太低。而且remove算法的操作全部使用的是vector的public接口,erase也是对容器操作的算法。这就说明了无论是作为类的方法或者是free function都是可以的。
 
将该功能放到vector等容器中,必然会增加该类不必要的接口复杂性(对string的批判便来自于此)。而作为free function,算法将能够应用于多个不同的容器,只不过书写的方法稍有变化而已。
 
list的remove则是必然的,它是基于list特有的常数时间的操作,而通用算法不能够达到这样的要求。
 
在07-10-19,怀宇范 <dugu...@gmail.com> 写道:
确实很低。可以参见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;

Oxygen

unread,
Oct 19, 2007, 1:18:33 PM10/19/07
to TopLanguage
我觉得不是这个原因。应为vector提供了erase方法。该方法和remove的时间复杂度是相同的。如果是由于时间复杂度的原因的话,就也不应该
提供erase方法。

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;

stlf

unread,
Oct 21, 2007, 2:57:38 AM10/21/07
to TopLanguage

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;
> > > }

我觉得你说得已经比较正确了, 谢谢你,谢谢大家的讨论。

清风雨

unread,
Oct 22, 2007, 10:16:24 PM10/22/07
to TopLanguage
好像似乎是因为算法和list的非random的iterator结合问题吧,还有一个是设计约束(我就不希望你这么干)。
std:find等很多通用算法在list、map等上都有特定实现。所以Scott说优先选择专有实现(一个是没选择,一个是优化)。
Reply all
Reply to author
Forward
0 new messages