Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要插入到集合中<;向量<;字符串>&燃气轮机;这么慢?_C++_Performance_Vector_Set - Fatal编程技术网

C++ 为什么要插入到集合中<;向量<;字符串>&燃气轮机;这么慢?

C++ 为什么要插入到集合中<;向量<;字符串>&燃气轮机;这么慢?,c++,performance,vector,set,C++,Performance,Vector,Set,对于一个类项目,我们正在制作一个简单的编译器/关系数据库。我的答案是正确的,但在大型查询中速度太慢。我运行了VisualStudio的性能分析,我的程序花费了80%的时间将元组(表中的行)插入到集合中。该函数是计算叉积的一部分,因此结果有很多行,但我需要关于将元组插入集合的更快方法的建议 for (set<vector<string>>::iterator it = tuples.begin(); it != tuples.end(); ++it) { for (

对于一个类项目,我们正在制作一个简单的编译器/关系数据库。我的答案是正确的,但在大型查询中速度太慢。我运行了VisualStudio的性能分析,我的程序花费了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
    }
}
for(set::iterator it=tuples.begin();it!=tuples.end();+it)
{
for(set::iterator it2=tuples2.begin();it2!=tuples2.end();+it2)
{
向量f(*it);
f、 插入(f.end(),it2->begin(),it2->end());
newTuples.insert(f);//这是占用所有处理时间的行
}
}

您无缘无故地按值复制大向量。您应该移动:
newTuples.insert(std::move(f))

您无缘无故地按值复制大向量。您应该移动:
newTuples.insert(std::move(f))

一个
集合
可能是错误的容器。
集合
是有序的,只保留唯一的元素。插入新的
向量时,可能会发生许多
字符串
比较

使用
列表
向量
(如果可以的话)


…并避免不必要的复制,正如SergeyA在他的回答中指出的那样,A
set
可能是错误的容器。
集合
是有序的,只保留唯一的元素。插入新的
向量时,可能会发生许多
字符串
比较

使用
列表
向量
(如果可以的话)

…并避免不必要的复制,正如SergeyA在他的回答中指出的那样,我们不妨使用C++11(完全未经测试的代码)

注意:有些字符串会从结果中消失,这真的是您想要的吗? 你使用向量作为键,会不会发生碰撞?加

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

这将消除所有移动的双重工作(如果编译器无论如何都没有优化它)。

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

注意:有些字符串会从结果中消失,这真的是您想要的吗? 你使用向量作为键,会不会发生碰撞?加

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


这将消除所有移动的双重工作(如果编译器无论如何都没有对其进行优化)。

什么是
newTuples
?在每次插入时通过复制创建向量。使用指针和new。@Pierreemanuellallemant,这是一个多么糟糕的建议…@SergeyA:不知道std::move,ty.newTuples是我正在创建的新表中的所有行。什么是
newTuples
?你的向量是在每次插入时通过复制创建的。使用指针和新的。@Pierreemanuellallemant,这是一个多么糟糕的建议…@SergeyA:我不知道std::move,ty.newTuples是我正在制作的新表中的所有行。你可能是对的,我最初使用集合是为了简单地消除重复项。现在更改它需要大量重构,可能不值得我1%的分数。你可能是对的,我最初使用集合作为消除重复项的简单方法。现在更改它将需要大量重构,可能不值得我1%的分数。这是有道理的,但对函数所用的时间没有影响。向量不是很大(最多20个项目)是有意义的,但对函数花费的时间没有影响。向量不是很大(最多20项)