C++11 vector::emplace function

The C++11 vector emplace function inserts object at a position before the specified iterator in a vector.This function was added as part of C++11 features.

template<typename Arg>iterator emplace(const_iterator pos , Arg… );(C++11)

pos – An iterator denoting the position before which the object must be inserted.

Return type
iterator – It points to the inserted data.

In using this function the data to be inserted is constructed in the position just before the position pointed by the iterator passed as the first argument.If the type of the vector is a user-defined type :class or structure, you can directly passed the data of the type accepted by the constructor.In doing so the object of the class or structure is constructed in the required position(a code example is given to illustrates this concept later).

Code example: when the type is built-in type.

vector<int> vec={ 2 , 3 } ;

vec.emplace( vec.begin( ) , 678 ) ; //inserts 678 before vec.begin( )

for(auto elem:vec)
cout<< elem << ” ” ;


678 2 3

Code example: Checking the iterator returned by emplace.

vector<int>::vecIt =vec.emplace( vec.begin( )+1 , 999 ) ; //inserts 999 befor ‘vec.begin() +1’ (at vec[1] position)

cout<< *vecIt ;



vecIt points to 999-the inserted data.

Code example: When the type is a user-defined data type
(code explanation is given below).

class test
 int i ;
 string st ;
 test(int ii , string s): i(ii) , st(s) { }

 string getStr( ) const { return st; }
 int getInt( ) const { return i; }

 ~test( ) { }

int main( )
vector<test> vectest={ test(34 ,” testing emplace”) , test(90 , ” function”) } ; //Object initialization

//work fine
vectest.emplace( vectest.begin() , test(10 , ” Happy”) ) ;

//work fine
vectest.emplace( vectest.end( ) , 100 , ” call” ) ; 

//error!! cannot construct ‘test’ object from an integer data
vectest.emplace( vectest.begin( )+1 , 89 ) ;  //error!!

//error!! in argument type arrangement
vectest.emplace( vectest.begin()+1 , “World” , 789 );  //Error!!

for(auto elem: vectest )
cout<< elem.getInt( ) << elem.getStr( ) << endl ;
cin.get( ) ;
return 0 ;


10 Happy
34 testing emplace
90 function
100 call

In the first emplace call (line 20 for Computer user) a test object is passed which is inserted at the beginning of the vector.

In the second emplace call (line 23 for Computer user) we have not passed a test object ,instead we have passed an integer(100) and a string(” call”) as second and third argument.But the code seem to work fine why? If we look at the constructor of test it accepts an integer and a string data.Although we have not passed a test object explicitly the emplace function will create one by using the second and third argument to call the constructor of test.The emplace function creates a test object automatically for us and this object is inserted at the end of the container.

In the third emplace call (Line 26 for Computer) we have passed just an integer value (89) which is not sufficient to call the test constructor,which accepts int and string data.Hence in this case emplace cannot generate a test object.So we get an error.

In the fourth emplace call (line 29 for computer user) the second argument is string(“World”) and the third argument is int type(7809).The constructor of test however accepts int as first argument and string as second argument.There is a contradiction in the type here so in this case also emplace cannot call the test constructor and hence it’s object cannot be created.So we get an error.