免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 66259 | 回复: 23
打印 上一主题 下一主题

C++ 中怎么实现高效的string的split函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-22 11:23 |只看该作者 |倒序浏览
问题是这样的
一个string text="aa aa bbc cccd"根据分隔符(默认是空格)讲其中的一个个字串提出来放到vector中
暂时是这么做的(见下面代码),当要处理的string很多,较长时要保证程序的效率,大家有什麽好的做法吗?

82         while(1)               
83         {               
84                 int pos = text.find(' ');
85                 if( pos==0)
86                 {      
87                         text=text.substr(1);
88                         continue;
89                 }      
90                 if( pos<0)
91                 {
92                         vec.push_back(text);
93                         break;
94                 }      
95                 word = text.substr(0,pos);
96                 text = text.substr(pos+1);
97                 vec.push_back(word);
98         }

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
2 [报告]
发表于 2008-09-22 11:32 |只看该作者

回复 #1 cc007cc 的帖子

如果性能要求很高,建议用C写。

论坛徽章:
0
3 [报告]
发表于 2008-09-22 11:37 |只看该作者
strtok
       

  原型:extern char *strtok(char *s, char *delim);
        
  用法:#include <string.h>
  
  功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
  
  说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
        strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。
        返回指向下一个标记串。当没有标记串时则返回空字符NULL。
  
  举例:


      // strtok.c

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include <syslib.h>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include <string.h>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include <stdio.h>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *s="Golden Global View";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *d=" ";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clrscr();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=strtok(s,d);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(p)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",s);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strtok(NULL,d);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
4 [报告]
发表于 2008-09-22 11:38 |只看该作者
贴一个C实现的函数:
调用示例:
#define MAX_COLS 10
  char src[256];
char *cols[MAX_COLS];
  int count;
  int i;
  strcpy(src, "aa aa bbc cccd");
count = splitEx(src, ' ', cols, MAX_COLS);
  for (i=0; i<count; i++)
  {
       printf("%d. %s\n", i+1, cols[i]);
  }

int splitEx(char *src, const char seperator, char **pCols, const int nMaxCols)
{
        char *p;
        char **pCurrent;
        int count = 0;

        if (nMaxCols <= 0)
        {
                return 0;
        }

        p = src;
        pCurrent = pCols;

        while (true)
        {
                *pCurrent = p;
                pCurrent++;

                count++;
                if (count >= nMaxCols)
                {
                        break;
                }

                p = strchr(p, seperator);
                if (p == NULL)
                {
                        break;
                }

                *p = '\0';
                p++;
        }

        return count;
}

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
5 [报告]
发表于 2008-09-22 11:48 |只看该作者
一开始设计的时候定长就能做到最高效

论坛徽章:
0
6 [报告]
发表于 2008-09-22 12:39 |只看该作者

回复 #2 happy_fish100 的帖子

算法如果不好,选再好的语言都没辙.

TO LZ:你的算法是低效的, 问题在于每次匹配剩下的字符串都要通过substr复制,我写了一个:


  1. #include <string>
  2. #include <iostream>
  3. #include <vector>

  4. using namespace std;

  5. int main()
  6. {
  7.         string test = "aa aa bbc cccd";
  8.         vector<string> strvec;
  9.         string strtemp;
  10.        
  11.         string::size_type pos1, pos2;
  12.         pos2 = test.find(' ');
  13.         pos1 = 0;       
  14.         while (string::npos != pos2)
  15.         {
  16.                 strvec.push_back(test.substr(pos1, pos2 - pos1));
  17.                
  18.                 pos1 = pos2 + 1;
  19.                 pos2 = test.find(' ', pos1);
  20.         }
  21.         strvec.push_back(test.substr(pos1));
  22.        
  23.         vector<string>::iterator iter1 = strvec.begin(), iter2 = strvec.end();
  24.         while (iter1 != iter2)
  25.         {
  26.                 cout << *iter1 << endl;
  27.                 ++iter1;
  28.         }
  29.        
  30.         return 0;
  31. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2008-09-22 12:42 |只看该作者
strtok

论坛徽章:
0
8 [报告]
发表于 2008-09-22 14:45 |只看该作者
非常感谢大家的回复,给我了很大帮助。
感谢“法王” converse   的方法,哈哈效率已经很好了,就不在试strtok了,
谢谢大家
原来的方法   法王的方法(单位:sec)
3.49           0.64
1.18           0.46
2.03           0.63
7.2           0.59

论坛徽章:
0
9 [报告]
发表于 2008-09-22 14:56 |只看该作者

回复 #8 cc007cc 的帖子

谢谢你用测试结果为C++正名,挺烦这种所谓的效率问题没有找到症结所在就说什么用C做的说法.

论坛徽章:
0
10 [报告]
发表于 2008-09-22 15:06 |只看该作者

回复 #9 converse 的帖子

“算法如果不好,选再好的语言都没辙”
哈哈 法王说的有道理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP