diff --git a/src/HMMSegment.hpp b/src/HMMSegment.hpp index e0d1267..cbe9e59 100644 --- a/src/HMMSegment.hpp +++ b/src/HMMSegment.hpp @@ -105,7 +105,7 @@ namespace CppJieba bool _cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector& res) const { assert(_getInitFlag()); - vector status(end - begin); + vector status; if(!_viterbi(begin, end, status)) { LogError("_viterbi failed."); @@ -134,16 +134,18 @@ namespace CppJieba return false; } vector words; + words.reserve(end - begin); if(!cut(begin, end, words)) { return false; } - string tmp; + size_t offset = res.size(); + res.resize(res.size() + words.size()); 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; @@ -159,7 +161,7 @@ namespace CppJieba size_t Y = STATUS_SUM; size_t X = end - begin; - assert(status.size() == X); + size_t XYSize = X * Y; size_t now, old, stat; double tmp, endE, endS; @@ -210,6 +212,7 @@ namespace CppJieba stat = S; } + status.resize(X); for(int x = X -1 ; x >= 0; x--) { status[x] = stat; diff --git a/src/MixSegment.hpp b/src/MixSegment.hpp index c3b5ca5..f6854b8 100644 --- a/src/MixSegment.hpp +++ b/src/MixSegment.hpp @@ -99,9 +99,8 @@ namespace CppJieba virtual bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector& res)const { assert(_getInitFlag()); - if(begin >= end) + if(begin == end) { - LogError("begin >= end"); return false; } @@ -109,7 +108,6 @@ namespace CppJieba uRes.reserve(end - begin); if (!cut(begin, end, uRes)) { - LogError("get unicode cut result error."); return false; } diff --git a/src/SegmentBase.hpp b/src/SegmentBase.hpp index 226a3d6..b612e54 100644 --- a/src/SegmentBase.hpp +++ b/src/SegmentBase.hpp @@ -39,7 +39,7 @@ namespace CppJieba public: virtual bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector& res) const = 0; - virtual bool cut(const string& str, vector& res)const + virtual bool cut(const string& str, vector& res) const { assert(_getInitFlag()); res.clear(); @@ -51,10 +51,9 @@ namespace CppJieba TransCode::decode(str, unicode); Unicode::const_iterator left = unicode.begin(); - Unicode::const_iterator right = unicode.begin(); + Unicode::const_iterator right; - string oneword; - while(right != unicode.end()) + for(right = unicode.begin(); right != unicode.end(); right++) { if(isIn(_specialSymbols, *right)) { @@ -62,14 +61,9 @@ namespace CppJieba { cut(left, right, res); } - TransCode::encode(right, right + 1, oneword); - res.push_back(oneword); - right ++; - left = right; - } - else - { - right ++; + res.resize(res.size() + 1); + TransCode::encode(right, right + 1, res.back()); + left = right + 1; } } if(left != right)