Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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++ 为什么std::inserter这么慢? 让我们考虑下面的代码 #include <vector> using container = std::vector<int>; const int size = 1000000; const int count = 1000; void foo(std::insert_iterator<container> ist) { for(int i=0; i<size; ++i) *ist++ = i; } void bar(container& cnt) { for(int i=0; i<size; ++i) cnt.push_back(i); } int main() { container cnt; for (int i=0; i<count; ++i) { cnt.clear(); #ifdef FOO foo(std::inserter(cnt, cnt.begin())); // using cnt.end() gives similar results #else bar(cnt); #endif } return 0; }_C++_C++11_Stl_Inserter - Fatal编程技术网

C++ 为什么std::inserter这么慢? 让我们考虑下面的代码 #include <vector> using container = std::vector<int>; const int size = 1000000; const int count = 1000; void foo(std::insert_iterator<container> ist) { for(int i=0; i<size; ++i) *ist++ = i; } void bar(container& cnt) { for(int i=0; i<size; ++i) cnt.push_back(i); } int main() { container cnt; for (int i=0; i<count; ++i) { cnt.clear(); #ifdef FOO foo(std::inserter(cnt, cnt.begin())); // using cnt.end() gives similar results #else bar(cnt); #endif } return 0; }

C++ 为什么std::inserter这么慢? 让我们考虑下面的代码 #include <vector> using container = std::vector<int>; const int size = 1000000; const int count = 1000; void foo(std::insert_iterator<container> ist) { for(int i=0; i<size; ++i) *ist++ = i; } void bar(container& cnt) { for(int i=0; i<size; ++i) cnt.push_back(i); } int main() { container cnt; for (int i=0; i<count; ++i) { cnt.clear(); #ifdef FOO foo(std::inserter(cnt, cnt.begin())); // using cnt.end() gives similar results #else bar(cnt); #endif } return 0; },c++,c++11,stl,inserter,C++,C++11,Stl,Inserter,使用工具栏: $ g++ -g -pipe -march=native -pedantic -std=c++11 -W -Wall -Wextra -Werror -O3 -o bin/inserter src/inserter.cc $ time ./bin/inserter ./bin/inserter 2,08s user 0,01s system 99% cpu 2,092 total 有人能解释为什么会有如此多的性能变化,为什么会有人想使用std::inserter?,因为您是在向

使用工具栏:

$ g++ -g -pipe -march=native -pedantic -std=c++11 -W -Wall -Wextra -Werror -O3 -o bin/inserter src/inserter.cc
$ time ./bin/inserter
./bin/inserter  2,08s user 0,01s system 99% cpu 2,092 total

有人能解释为什么会有如此多的性能变化,为什么会有人想使用
std::inserter

,因为您是在向量的前面而不是后面插入。这会导致频繁重新分配向量的存储。另一方面,背面的插入仅在当前容量耗尽时才需要重新分配(这可以通过
cnt.reserve(N)
成员来缓解)

改用
std::back\u插入器(cnt)
,它将在每次调用其解引用
操作符时调用
cnt.push\u back()


关于
insert
push_back
之间的区别,请参见(但不是完全重复的IMO)问答。<>代码> STD::插入器< /代码>是在容器的中间插入,或者用于缺少<代码> PasyBuff< <代码>成员的容器(或“<代码> PurthPosid成员”,这将阻止使用<代码> STD::FrntToStIdter < /COD>).

使用<代码> FoO(STD:插入符(CNT,CNT.()));<代码>我得到了相同的性能差异OK,现在我遇到了一个奇怪的问题,编辑或注释
foo
的代码会在没有-DFOO标志的情况下影响编译的性能…@Amxx:
foo(std::inserter(cnt,cnt.end())在末尾插入,但仅插入一次。在每次赋值增加位置后,必须使用
std::back\u inserter
@Jarod42
insert\u iterator
,因此注释“在末尾插入,但仅插入一次”是不正确的
inserter(vec,vec.end())
相当于
back\u inserter(vec)
。观察到的速度差异很可能是由于执行了
insert
,这比
push_back
慢,即使在向量的末尾也是如此。@Oktalist这绝对不是真的-第二个参数是新元素插入器的位置。只有当向量为空时,end()和begin()的两个调用才是等效的。
$ g++ -g -pipe -march=native -pedantic -std=c++11 -W -Wall -Wextra -Werror -O3 -o bin/inserter src/inserter.cc
$ time ./bin/inserter
./bin/inserter  2,08s user 0,01s system 99% cpu 2,092 total