c++中std::set的高效插入技术

Efficient insertion technique for std::set C++

本文关键字:高效 插入 技术 set std c++      更新时间:2023-10-16

这是一个更好的(更优化或更快的技术)代码:

查找+插入

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();
}

Insert + usereturndpair

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

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

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

第二个版本快一点的原因是因为std::set::insert已经在它的容器中搜索了一个可能的副本。这意味着在第一个版本中,您要搜索集合2次,而第二个版本只搜索1次。

请注意,启用优化后,两个版本的时间都减少到不到1ms,所以基本上"没关系"。