Przestrzenie nazw
Warianty

std::set::emplace

Z cppreference.com
<tbody> </tbody>
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

tworzy elementy "w miejscu", korzystając z podpowiedzi
(publiczna metoda) [edit]
wstawia elementy
(publiczna metoda) [edit]
Morty Proxy This is a proxified and sanitized view of the page, visit original site.