use vector's reserve

This commit is contained in:
wyy 2014-05-24 16:09:00 +08:00
parent bc6ed2368d
commit 75581495b4
3 changed files with 15 additions and 20 deletions

View File

@ -105,7 +105,7 @@ namespace CppJieba
bool _cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<Unicode>& res) const bool _cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<Unicode>& res) const
{ {
assert(_getInitFlag()); assert(_getInitFlag());
vector<size_t> status(end - begin); vector<size_t> status;
if(!_viterbi(begin, end, status)) if(!_viterbi(begin, end, status))
{ {
LogError("_viterbi failed."); LogError("_viterbi failed.");
@ -134,16 +134,18 @@ namespace CppJieba
return false; return false;
} }
vector<Unicode> words; vector<Unicode> words;
words.reserve(end - begin);
if(!cut(begin, end, words)) if(!cut(begin, end, words))
{ {
return false; return false;
} }
string tmp; size_t offset = res.size();
res.resize(res.size() + words.size());
for(size_t i = 0; i < words.size(); i++) for(size_t i = 0; i < words.size(); i++)
{ {
if(TransCode::encode(words[i], tmp)) if(!TransCode::encode(words[i], res[offset + i]))
{ {
res.push_back(tmp); LogError("encode failed.");
} }
} }
return true; return true;
@ -159,7 +161,7 @@ namespace CppJieba
size_t Y = STATUS_SUM; size_t Y = STATUS_SUM;
size_t X = end - begin; size_t X = end - begin;
assert(status.size() == X);
size_t XYSize = X * Y; size_t XYSize = X * Y;
size_t now, old, stat; size_t now, old, stat;
double tmp, endE, endS; double tmp, endE, endS;
@ -210,6 +212,7 @@ namespace CppJieba
stat = S; stat = S;
} }
status.resize(X);
for(int x = X -1 ; x >= 0; x--) for(int x = X -1 ; x >= 0; x--)
{ {
status[x] = stat; status[x] = stat;

View File

@ -99,9 +99,8 @@ namespace CppJieba
virtual bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<string>& res)const virtual bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<string>& res)const
{ {
assert(_getInitFlag()); assert(_getInitFlag());
if(begin >= end) if(begin == end)
{ {
LogError("begin >= end");
return false; return false;
} }
@ -109,7 +108,6 @@ namespace CppJieba
uRes.reserve(end - begin); uRes.reserve(end - begin);
if (!cut(begin, end, uRes)) if (!cut(begin, end, uRes))
{ {
LogError("get unicode cut result error.");
return false; return false;
} }

View File

@ -51,10 +51,9 @@ namespace CppJieba
TransCode::decode(str, unicode); TransCode::decode(str, unicode);
Unicode::const_iterator left = unicode.begin(); Unicode::const_iterator left = unicode.begin();
Unicode::const_iterator right = unicode.begin(); Unicode::const_iterator right;
string oneword; for(right = unicode.begin(); right != unicode.end(); right++)
while(right != unicode.end())
{ {
if(isIn(_specialSymbols, *right)) if(isIn(_specialSymbols, *right))
{ {
@ -62,14 +61,9 @@ namespace CppJieba
{ {
cut(left, right, res); cut(left, right, res);
} }
TransCode::encode(right, right + 1, oneword); res.resize(res.size() + 1);
res.push_back(oneword); TransCode::encode(right, right + 1, res.back());
right ++; left = right + 1;
left = right;
}
else
{
right ++;
} }
} }
if(left != right) if(left != right)