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
{
assert(_getInitFlag());
vector<size_t> status(end - begin);
vector<size_t> status;
if(!_viterbi(begin, end, status))
{
LogError("_viterbi failed.");
@ -134,16 +134,18 @@ namespace CppJieba
return false;
}
vector<Unicode> 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;

View File

@ -99,9 +99,8 @@ namespace CppJieba
virtual bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<string>& 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;
}

View File

@ -39,7 +39,7 @@ namespace CppJieba
public:
virtual bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<string>& res) const = 0;
virtual bool cut(const string& str, vector<string>& res)const
virtual bool cut(const string& str, vector<string>& 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)