以某个字符串为分割标志将字符串分割
#include <string>
#include <list>
#include <iostream>
template <typename T>
int Divid(const std::basic_string<T>& sTContent, const std::basic_string<T>& TDiv, std::list<std::basic_string<T>>& listTString)
{
if( true == TDiv.empty() || true == TDiv.empty() )
{
return -1;
}
int i = 0, j = 0, start = 0;
for( ; i < sTContent.size(); i++ ) //C++11起size()为常数
{
if( TDiv.size() == j )
{
if( i - j - start >= 1 ) //避免分隔符连续的情况下,误将分隔符放入容器
listTString.emplace_back(&sTContent[start], &sTContent[i - j]);
start = i;
j = 0;
}
if( sTContent[i] == TDiv[j] )
{
j++;
}
else
{
i -= j;
j = 0;
}
}
if( TDiv.size() == j ) //捡漏
{
if( i - j - start >= 1 ) //避免分隔符连续的情况下,误将分隔符放入容器
listTString.emplace_back(&sTContent[start], &sTContent[i - j]);
start = i;
j = 0;
}
return 0;
}
int main(int argc, char **argv)
{
std::string sss("ABC\r\nDEF\r\nGHI\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n");
std::wstring wss(L"ABC\r\nDEF\r\nGHI\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n");
std::list<std::string> listS;
std::list<std::wstring> listW;
Divid(sss, std::string("\r\n"), listS);
Divid(wss, std::wstring(L"\r\n"), listW);
for( const auto& elem :listS )
{
std::cout << elem << std::endl;
}
for( const auto& elem : listW )
{
std::wcout << elem << std::endl;
}
return 0;
}
输出
时间复杂度为O(n*m)
没用C/C++库中的算法,是因为不清楚库中的算法时间复杂度是多少,网上说C++库中find的时间复杂度为O(n*m),C库strtok至少为O(N)