std::set::emplace
template< class... Args > std::pair<iterator,bool> emplace( Args&&... args ); |
(od C++11) | |
Wstawia nowy element do kontenera, konstruowany "w miejscu"(ang) z argumentami args przekazanymi do konstruktora , o ile kontener nie zawiera już elementu o identycznym kluczu.
Ostrożne wykorzystanie emplace pozwala uniknąć niepotrzebnych operacji kopiowania/przenoszenia.
Konstruktor nowego elementu jest wywołany z dokładnie tymi samymi argumentami, z którymi zostało wywołane emplace, przekazanymi poprzez std::forward<Args>(args)....
Nowy lement może zostać skonstruowany nawet, jeśli w kontenerze istnieje już element o identycznym kluczu. W takim wypadku nowo utworzony element zostanie natychmiast zniszczony.
Żadne iteratory ani referencje nie zostają unieważnione.
Parametry
| args | - | argumenty do przekazania do konstruktora elementu |
Zwracana wartość
Zwraca parę składającą się z iteratora na wstawiony element (lub element, który uniemożliwił wstawienie) i wartości bool ustawionej na true, jeśli wstawienie rzeczywiście nastąpiło.
Wyjątki
Jeśli zostanie wyrzucony wyjątek przez jakąkolwiek operację, ta funkcja nie ma żadnego efektu.
Złożoność
Logarytmiczna względem rozmiaru kontenera.
Przykład
#include <chrono>
#include <functional>
#include <iomanip>
#include <iostream>
#include <set>
#include <string>
class Dew
{
private:
int a;
int b;
int c;
public:
Dew(int _a, int _b, int _c)
: a(_a), b(_b), c(_c)
{}
bool operator<(const Dew &other) const
{
if (a < other.a)
return true;
if (a == other.a && b < other.b)
return true;
return (a == other.a && b == other.b && c < other.c);
}
};
const int nof_operations = 120;
int set_emplace() {
std::set<Dew> set;
for(int i = 0; i < nof_operations; ++i)
for(int j = 0; j < nof_operations; ++j)
for(int k = 0; k < nof_operations; ++k)
set.emplace(i, j, k);
return set.size();
}
int set_insert() {
std::set<Dew> set;
for(int i = 0; i < nof_operations; ++i)
for(int j = 0; j < nof_operations; ++j)
for(int k = 0; k < nof_operations; ++k)
set.insert(Dew(i, j, k));
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()
{
set_insert();
timeit(set_insert, "insert");
timeit(set_emplace, "emplace");
timeit(set_insert, "insert");
timeit(set_emplace, "emplace");
}
Możliwy wynik:
638.45 ms for insert
619.44 ms for emplace
609.43 ms for insert
652.55 ms for emplace
Zobacz także
(C++11) |
tworzy elementy "w miejscu", korzystając z podpowiedzi (publiczna metoda) |
| wstawia elementy (publiczna metoda) |