std::set::emplace_hint
STD::SET::Emplace[医]暗示
template | | (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) |
---|---|
insert | inserts elements or nodes (since C++17) (public member function) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。