Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988635
  • 博文数量: 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) 产生了不一致的效果

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

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

郁闷的豆豆
哦,可能你忘记了吧,就是你的俄罗斯方块的代码呀.你不是说闲来无事写了个吗?嘿嘿,就是游戏的GAME OVER呀...

网友评论2012-11-23 15:16:57

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:16:49

周星星
哪来的“GAME OVER”?

第二个问题:
#include <iostream>

size_t remove( int* p, size_t len, const int& val ) // 此函数就是把p到p+len之间所有值为val的元素都删除,返回新数组的长度
{
    if( len == 0 )
        return 0;

    if( *p == val )
    {
        memcpy( p, p+1, (len-1)*sizeof(int) );
        return r

网友评论2012-11-23 15:16:39

郁闷的豆豆
终于冲上来了
一个于本页无关的话题

我想问下你的“GAME OVER”是怎么固定在屏幕上的,大大的代码我看不懂。想请教大大把调用函数单独提取出来给我好吗??谢谢,一个在校菜鸟大学生的请求

golddragoonking@yahoo.com.cn

网友评论2012-11-23 15:16:32

10000
星哥, 小弟愚钝怎么也想不明白这个值到底是怎么被改变的。
我用的是VS2005。
能说说吗?