close
Espacios de nombres
Variantes

std::set<Key,Compare,Allocator>::emplace_hint

De cppreference.com
 
 
 
 
<tbody> </tbody>
template <class... Args> iterator emplace_hint( const_iterator hint, Args&&... args );
(desde C++11)

Inserta (emplaza) un nuevo elemento en el contenedor lo más cerca posible de la posición justo antes de hint. El elemento se construye en el lugar, es decir, no se realizan operaciones de copia o movimiento.

El constructor del elemento se llama con exactamente los mismos argumentos que se suministraron a la función, reenviados con std::forward<Args>(args)....

No se invalidan ni referencias ni iteradores.

Parámetros

hint - El iterador a la posición antes de la cual se insertará el nuevo elemento.
args - Los argumentos a reenviar al constructor del elemento.

Valor de retorno

Devuelve un iterador al elemento recién insertado.

Si la inserción falló porque el elemento ya existe, devuelve un iterador al elemento ya existente con la clave equivalente.

Excepciones

Si alguna operación lanza una excepción, esta función no tiene ningún efecto (garantía de excepción fuerte).

Complejidad

En general, logarítmica en el tamaño del contenedor, pero amortizada constante si el nuevo elemento se inserta justo antes de hint.

Ejemplo

#include <set>
#include <chrono>
#include <iostream>
#include <iomanip>
#include <functional>

const int nof_operaciones = 100500;

int emplazar_para_set() {
  std::set<int> set;
  for(int i = 0; i < nof_operaciones; ++i) {
    set.emplace(i);
  }
  return set.size();
}

int pista_de_emplazamiento_para_set() {
  std::set<int> set;
  auto it = set.begin();
  for(int i = 0; i < nof_operaciones; ++i) {
    set.emplace_hint(it, i);
    it = set.end();
  }
  return set.size();
}

int pista_de_emplazamiento_para_set_equivocada() {
  std::set<int> set;
  auto it = set.begin();
  for(int i = nof_operaciones; i > 0; --i) {
    set.emplace_hint(it, i);
    it = set.end();
  }
  return set.size();
}

int pista_de_emplazamiento_para_set_corregida() {
  std::set<int> set;
  auto it = set.begin();
  for(int i = nof_operaciones; i > 0; --i) {
    set.emplace_hint(it, i);
    it = set.begin();
  }
  return set.size();
}

int pista_de_emplazamiento_para_set_mas_cercana() {
  std::set<int> set;
  auto it = set.begin();
  for(int i = 0; i < nof_operaciones; ++i) {
    it = set.emplace_hint(it, i);
  }
  return set.size();
}

void cronometrar(std::function<int()> prueba_de_set, std::string que = "") {
  auto inicio = std::chrono::system_clock::now();
  int setsize = prueba_de_set();
  auto detencion = std::chrono::system_clock::now();
  std::chrono::duration<double, std::milli> tiempo = detencion - inicio;
  if (que.size() > 0 && setsize > 0) {
    std::cout << std::fixed << std::setprecision(2) << std::setw(5)
              << tiempo.count() << "  ms para " << que << '\n';
  }
}

int main() {
   cronometrar(emplazar_para_set); // calentamiento de pila
   cronometrar(emplazar_para_set, "el emplazamiento simple");
   cronometrar(pista_de_emplazamiento_para_set, "el emplazamiento con la pista correcta");
   cronometrar(pista_de_emplazamiento_para_set_equivocada, "el emplazamiento con la pista equivocada");
   cronometrar(pista_de_emplazamiento_para_set_corregida, "el emplazamiento corregido");
   cronometrar(pista_de_emplazamiento_para_set_mas_cercana, "el emplazamiento usando el iterador devuelto");
}

Posible salida:

18.96  ms para el emplazamiento simple
 7.95  ms para el emplazamiento con la pista correcta
19.39  ms para el emplazamiento con la pista equivocada
 8.39  ms para el emplazamiento corregido
 7.90  ms para el emplazamiento usando el iterador devuelto

Véase también

(C++11)
Construye el elemento en el sitio.
(función miembro pública) [editar]
Inserta elementos o nodos (desde C++17)
(función miembro pública) [editar]