CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

求解简单的向量问题

楼主smartdrvsky(子夜书香)2006-03-10 22:49:17 在 C/C++ / 新手乐园 提问

已知一个向量中元素按非递减有序排列,  
  编写一个函数删除向量中多余的相同的元素。  
   
  我自己想了一思路,不足之处望各位老师解答  
  思路如下:  
  用两个循环,第一个循环实现比较功能(比较a[i]是否大于a[i+1])  
  第二个循环实现如果有重复的元素则删除多余的然后向前移位。  
  我自己的解法如下:  
  avoid   delete   (vector   v1)  
    {int   i=0,j;  
      if   (a([i]>a[i+1]i<=&&v1.length-1))  
            i++;  
        for     (j=i,j<=v1.length-1,j++)  
            v1.a[j-1]=v1.a[j];  
            v1.length--;  
      }  
   
  我自己反复思考了一下,觉得第一个循环没实现,因为只是比较相邻两个元素,然后第二个循环没有嵌套到第一个循环中。  
   
  我初学数据结构,关于简单的向量操作也不太熟悉,望高手将上述函数功能完善为盼!(在线等)  
   
  另外向量我是这样定义的  
  struct   vector  
  int   a[   ]  
  int   length  
  vector   v1 问题点数:100、回复次数:10Top

1 楼gyj_china(透明)回复于 2006-03-11 01:29:58 得分 0

已知一个向量中元素按非递减有序排列,  
  编写一个函数删除向量中多余的相同的元素。  
   
  //vector<int>out_vec必需是排过序的  
  int   erase(vector<int>out_vec)  
  {  
          vector<int>::iterator   vi;  
          vector<int>::iterator   p;  
          for   (vi   =   out_vec.begin(),   p   =   out_vec.begin();   p   !=   out_vec.end()-1;   p++){  
                if   (*(++vi)   ==   *p)  
                {  
                    out_vec.erase(vi);  
                    p--;  
                    vi--;  
                }  
          }  
  }Top

2 楼gyj_china(透明)回复于 2006-03-11 01:38:51 得分 0

不好意思,光写代码没讲思路,其它很简单.一个循环就可以了,上面我定义了两个游标,开始分别指向同一个向量首地址,但在比较时我把一个游标向后移了一位   if   (*(++vi)   ==   *p),如果相邻两位相同则删除后面的数据,游标位置不变化,再比较后面填充上来的数据.直到全部遍历一遍为止.Top

3 楼ugg(逸学堂(exuetang.net))回复于 2006-03-11 16:34:36 得分 0

使用标准模板库(STL)中,unique函数就可以实现对一个排序数组删除相同数据的功能。Top

4 楼csu_yzb(白杨)回复于 2006-03-11 17:21:08 得分 0

同意楼上的!Top

5 楼smartdrvsky(子夜书香)回复于 2006-03-11 18:22:44 得分 0

TO   gyj_china(透明):  
  你的思路很好,解答过程也很完整,但个人感觉初学者很难理解,麻烦你利用简单向量与数组操作语言将我所发代码完善吗?谢谢你的热情解答。  
  TO   ugg(逸学堂(exuetang.net))   :  
  无疑你的思路是最简洁的,可是我暂时还没学习STL,谢谢你的热情解答Top

6 楼smartdrvsky(子夜书香)回复于 2006-03-11 18:23:28 得分 0

哦,对了,透明,我说的是用C编,不是C++  
  C++我暂时还没学Top

7 楼province_(雍昊)回复于 2006-03-11 20:06:12 得分 20

i=0  
  while   i<v1.length-1  
      if   v1.a(i)=v1.a(i+1)   then  
          for   j=i+1   to   v1.length-2  
              v1.a(j)=v1.a(j+1)  
          next  
          v1.length=v1.length-1  
      else  
          i=i+1    
      end   if  
  wendTop

8 楼SEUU(三枝花)回复于 2006-03-11 20:49:17 得分 50

使用标准模板库(STL)中,unique函数就可以实现对一个排序数组删除相同数据的功能。  
   
  这个方法好,有现成的就是要用现成的,这就是C++!  
  你只要会用就行,不要去学太深,不过看你的想法主要是学算法,多看看数据结构吧.  
   
  还有,你的分多给我一点吧,我是来得分的,我只要星星!Top

9 楼wshcdr(dd)回复于 2006-03-11 21:08:57 得分 30

1.楼主去参考一下选择排序的算法  
  void   Select_Sort(int   R[],int   n)  
  { int   i,j,k,t;  
            for(i=1;i<n;i++)                            
          { for(k=i,j=i+1;j<=n;j++)          
              { if(R[j]<R[k])  
  k=j;  
  }  
              if(i!=k)  
              { R[0]=R[k];  
                R[k]=R[i];  
                R[i]=R[0];  
                }  
            for(t=1;t<=n;t++)  
            printf("%4d",R[t]);  
            printf("\n");  
  }  
  }  
   
  然后自己去删掉重复的值Top

10 楼smartdrvsky(子夜书香)回复于 2006-03-12 00:37:22 得分 0

TO   wshcdr(dd):  
  你的代码我基本上看懂了,是不是有一点需要完善呢?  
  1、如果有相同元素,是不是应该把数组长度减去相应的长度?  
  2、语句最后printf实现的函数功能的作用是?"%4d"的作用是?  
  恳请解答为盼,  
   
  最后再次感谢各位老师热心解答,  
  Top

相关问题

  • jsp求解?!(比较简单)
  • 简单问题求解!!
  • 简单问题求解!!!
  • 求解一简单问题??????
  • 简单问题,求解
  • 简单问题求解
  • 简单的问题求解?
  • 简单问题求解
  • 求解简单问题!
  • 简单问题求解

关键词

  • c++
  • 数据
  • vector
  • 向量
  • 游标
  • vec
  • 思路
  • 删除
  • vi
  • 简单

得分解答快速导航

  • 帖主:smartdrvsky
  • province_
  • SEUU
  • wshcdr

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo