为什么插入集合<vector <string>&gt;太慢了?

时间:2016-12-02 21:08:51

标签: c++ performance vector set

对于一个类项目,我们正在创建一个简单的编译器/关系数据库。我会产生正确答案,但对大型查询来说太慢。我运行了visual studio的性能分析,我的程序花了80%的时间将我的元组(表中的行)插入到一个集合中。该函数是计算跨产品的一部分,因此结果有很多行,但我需要更快的方法将我的元组插入集合中。

for (set<vector<string>>::iterator it = tuples.begin(); it != tuples.end(); ++it)
{
    for (set<vector<string>>::iterator it2 = tuples2.begin(); it2 != tuples2.end(); ++it2)
    {
        vector<string> f(*it);
        f.insert(f.end(), it2->begin(), it2->end());
        newTuples.insert(f); //This is the line that takes all the processing time
    }
}

3 个答案:

答案 0 :(得分:4)

您无缘无故地按值复制大向量。你应该移动:utl_http.end_response(l_http_response);

答案 1 :(得分:1)

set可能是错误的容器。订购set,并且仅保留唯一元素。当您插入新的string时,可能会发生许多vector次比较。

使用listvector代替(如果可以)。

...并且避免不必要的复制,正如SergeyA在他的回答中指出的那样

答案 2 :(得分:0)

我们不妨去C ++ 11(完全未经测试的代码)

for (const auto& it : tuples) {
    for (const auto& it2 : tuples2) {
        auto where = newTuples.emplace(it); // returns where its placed
        auto& vect = where.first; // makes the next more readable
        vect.insert(vect.end(), it2.begin(), it2.end());
    }
}

关于碰撞的注意事项一些字符串从结果中消失,这真的是你想要的吗? 你使用矢量作为关键,这将是一次碰撞吗?添加

if (!where.second) {
  ; // collision
}

检查。

这应该删除所有移动的双重工作(如果编译器无论如何都不优化它)。