哪种代码更好(更优化或更快):
查找+插入
for(int i = 0; i < A.length(); i++){
set<char> s;
s.insert(A[i]);
len = 1;
for(int j = i+1; j < A.length(); j++){
if(s.find(A[j]) == s.end()){
s.insert(A[j]);
}
else{ //Duplicate char found so break
break;
}
len++;
}
if(len > maxm) maxm = len;
s.clear();
}
或者,
插入+ UseReturnedPair
for(int i = 0; i < A.length(); i++){
set<char> s;
pair<set<char>::iterator, bool> ret;
s.insert(A[i]);
len = 1;
for(int j = i+1; j < A.length(); j++){
ret = s.insert(A[j]);
if(ret.second == false) break; //using *pair* returned from set::insert
len++;
}
if(len > maxm) maxm = len;
s.clear();
}
在我看来,后来看起来更优化,因为它消除了set::find
的额外开销。我的观察是否正确?更推荐哪一个?
答案 0 :(得分:2)
第二个版本稍快一些(VS 2015,Debug x86):
A.length() == 564
1) 62ms
2) 56ms
第二个版本更快一点的原因是因为std::set::insert
已经在其容器中搜索以找到可能的副本。这意味着在第一个版本中,您将搜索该集合2次,而第二个版本执行此操作1次。
请注意,启用优化后,两个版本的时间都会减少到不到1毫秒,所以基本上&#34;它并不重要&#34;。