std :: set C ++的高效插入技术

时间:2016-08-18 04:07:23

标签: c++ insert find set

哪种代码更好(更优化或更快):

查找+插入

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的额外开销。我的观察是否正确?更推荐哪一个?

1 个答案:

答案 0 :(得分:2)

第二个版本稍快一些(VS 2015,Debug x86):

A.length() == 564
1) 62ms
2) 56ms

第二个版本更快一点的原因是因为std::set::insert已经在其容器中搜索以找到可能的副本。这意味着在第一个版本中,您将搜索该集合2次,而第二个版本执行此操作1次。

请注意,启用优化后,两个版本的时间都会减少到不到1毫秒,所以基本上&#34;它并不重要&#34;。