关键字: 字符串分割
字符串按照特定字符进行分割是编程时候经常要用到方法
MFC中CString 和std::string 常可以用 find() + Mid() 的方法来实现
CString实现:
- inline static void split(CString src, CString token, vector<CString>& vect)
- {
- int nend=0;
- int nbegin=0;
- while(nend != -1)
- {
- nend = src.Find(token, nbegin);
- if(nend == -1)
- vect.push_back(src.Mid(nbegin, src.GetLength()-nbegin));
- else
- vect.push_back(src.Mid(nbegin, nend-nbegin));
- nbegin = nend + 1;
- }
- }
std::string实现
- inline static void split(std::string src, std::string token, vector<std::string>& vect)
- {
- int nend=0;
- int nbegin=0;
- while(nend != -1)
- {
- nend = src.find_first_of(token, nbegin);
- if(nend == -1)
- vect.push_back(src.substr(nbegin, src.length()-nbegin));
- else
- vect.push_back(src.substr(nbegin, nend-nbegin));
- nbegin = nend + 1;
- }
- }
上面2个例子中,分割出来字符串都是重新分配了内存的。
例如CString中Mid()函数就会
CString dest;
AllocCopy(dest, nCount, nFirst, 0); //这个地方将会为 dest分配内存空间
return dest;
所以在负荷较高的运行环境下会频繁的分配小块内存和释放小块内存,比较容易生产内存碎片,而且效率也不高。
潜意识中喜欢追求底层细节,让我想了解 在C语言中 char * 到底是怎么实现分割的?
果不其然C语言中的 strtok() 函数能够实现字符串的分割而且效率超高,不需要对分割后的字符串进行内存分配,而只是将被分割字 符中的 分隔符 ( token ) 以/0代替。而大家都知道 字符串都是以/0结尾的,所以这样就达到了将一个整串分割成多个字符串的目的。
char * 实现:
- inline static void Split(const char* content, const char* token, vector<std::string>& vect)
- {
- if(content == NULL)
- return;
- int len = strlen(content);
- if(len <= 0)
- return;
- char* pBuf =(char*)malloc(len+1);
- strcpy(pBuf , content);
- char* str = strtok(pBuf , token);
- while(str != NULL)
- {
- vect.push_back(str);
- str = strtok(NULL, token);
- }
- free(pBuf);
- }