Chinaunix首页 | 论坛 | 博客
  • 博客访问: 919644
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-23 15:15:12

调用者应当考虑函数对 const& 参数的影响

个人觉得这虽然是个小问题,但违反了const的直觉,有资格进入《Effective C++》的条款之中 ^_^
虽然这个问题和list的遍历删除元素问题类似,但这个问题不仅仅在于算法编写者和调用者常常并非同一人,更在于这个问题导致两者的耦合度的增加,而且大多数情况下无法避免这个耦合

#include
#include
#include
#include
using namespace std;

int main( void )
{
    int temp[] = { 1,3,2,4,2,3,3,9 };
    vector test( temp, temp+sizeof(temp)/sizeof(temp[0]) );
    vector::iterator itor=test.begin(); ++itor; // 此时 itor 指向第二个元素3

    //vector::value_type v = *itor;
    //test.erase( remove(test.begin(),test.end(),v), test.end() );
    test.erase( remove(test.begin(),test.end(),*itor), test.end() ); // 本意是想删除test容器中所有的3

    copy( test.begin(), test.end(), ostream_iterator::value_type>(cout," ") ); // 然而结果却只删除了第一个3,还有一个2受到无辜牵连
}

究其原因,是因为remove算法过程中*itor受到了改变(这和const&的含义发生了直觉上的违背),所以 remove(…,*itor)  和 remove(…,3) 产生了不一致的效果

阅读(1283) | 评论(10) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 15:17:45

BNJ
const&不可作为l-value,仅此而已

网友评论2012-11-23 15:17:37

alai04
我认为memcpy()的使用是没错的,错在const&不是真的const,它被memcpy()修改了,然后再被用于递归调用remove()。

网友评论2012-11-23 15:17:30

周星星
没错,memcpy( p+1, p 才有可能是错误的。

网友评论2012-11-23 15:17:23

10000
memcpy( p, p+1, (len-1)*sizeof(int) );  
这句MSDN上说:  
If the source and destination overlap, the behavior of memcpy is undefined.  
那是不是说你这样用memcpy是错误的? 因为p和p+1是有重叠的区域的?

网友评论2012-11-23 15:17:15

周星星
1. 你不说我怎么可能知道?
2. 就是调用windows的控制台相关API:WriteConsoleOutputCharacter呀,怎么再独立出来?