C++
容器 | Containers

std::set::emplace_hint

STD::SET::Emplace[医]暗示

template iterator emplace_hint( const_iterator hint, Args&&... args (since C++11)

在容器中插入一个新元素,尽可能靠近前面的位置。hint元素是就地构造的,即不执行复制或移动操作.

元素的构造函数使用与提供给函数的完全相同的参数调用,这些参数由std::forward<Args>(args)......

没有迭代器或引用无效。

参数

hint-iterator to the position before which the new element will be inserted
args-arguments to forward to the constructor of the element

返回值

将迭代器返回到新插入的元素。

如果插入失败是因为元素已经存在,则将迭代器返回给具有等效键的现有元素。

例外

如果任何操作引发异常,则此函数不具有%28强异常保证%29的效果。

复杂性

容器的大小一般为对数,但如果在前面插入新元素,则按摊销常数计算。hint...

二次

#include <set> #include <chrono> #include <iostream> #include <iomanip> #include <functional> const int nof_operations = 100500; int set_emplace() { std::set<int> set; for(int i = 0; i < nof_operations; ++i) { set.emplace(i } return set.size( } int set_emplace_hint() { std::set<int> set; auto it = set.begin( for(int i = 0; i < nof_operations; ++i) { set.emplace_hint(it, i it = set.end( } return set.size( } int set_emplace_hint_wrong() { std::set<int> set; auto it = set.begin( for(int i = nof_operations; i > 0; --i) { set.emplace_hint(it, i it = set.end( } return set.size( } int set_emplace_hint_corrected() { std::set<int> set; auto it = set.begin( for(int i = nof_operations; i > 0; --i) { set.emplace_hint(it, i it = set.begin( } return set.size( } int set_emplace_hint_closest() { std::set<int> set; auto it = set.begin( for(int i = 0; i < nof_operations; ++i) { it = set.emplace_hint(it, i } return set.size( } void timeit(std::function<int()> set_test, std::string what = "") { auto start = std::chrono::system_clock::now( int setsize = set_test( auto stop = std::chrono::system_clock::now( std::chrono::duration<double, std::milli> time = stop - start; if (what.size() > 0 && setsize > 0) { std::cout << std::fixed << std::setprecision(2) << time.count() << " ms for " << what << '\n'; } } int main() { timeit(set_emplace // stack warmup timeit(set_emplace, "plain emplace" timeit(set_emplace_hint, "emplace with correct hint" timeit(set_emplace_hint_wrong, "emplace with wrong hint" timeit(set_emplace_hint_corrected, "corrected emplace" timeit(set_emplace_hint_closest, "emplace using returned iterator" }

二次

可能的产出:

二次

18.96 ms for plain emplace 7.95 ms for emplace with correct hint 19.39 ms for emplace with wrong hint 8.39 ms for corrected emplace 7.90 ms for emplace using returned iterator

二次

另见

emplace (C++11)constructs element in-place (public member function)
insertinserts elements or nodes (since C++17) (public member function)

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/container/set/emplace[医]暗示