(C++ STL : iterator-6) back/front inserter

Posted by : at

Category : Cpp


Back_inserter

#include <iostream>
#include <list>
using namespace std;

int main(int argc, char** argv)
{
    list<int> s = { 1, 2, 3, 4, 5 };

    s.push_back(10);        // 이거말고 삽입할 방법이 없나?

    for( auto& n : s )
        cout << n << endl;
}
// back_insert_iterator를 사용해 보자.
back_insert_iterator<list<int>> p(s);
*p = 20;

back_insert_iterator의 장점이 있을까?

int x[5] = {10,20,30,40,50};
// 이걸 다 넣고 싶을때... for문을 만들까??

back_insert_iterator<list<int>> p(s);
copy(x, x+5, p);

좀 더 간결하게 써보자.

#include <iostream>
#include <list>
using namespace std;
 
int main() {
    int x[5] = {10,20,30,40,50};
	list<int> s = { 1, 2, 3, 4, 5 };
 
    copy(x, x+5, s.begin());        // 이렇게 쓰면 덮어 쓰게 된다.
    back_insert_iterator<list<int>> p(s);       
    // 그런데 list<int>를 아는데 꼭 써야하나??
    // 코드가 길어지는거 같은데?
    copy(x, x+5, p);

 
	for( auto& n : s )
        cout << n << endl;
 
	return 0;
}
#include <iostream>
#include <list>
using namespace std;

template<typename T>
back_insert_iterator<T>
back_insert(T& c)
{
    return back_insert_iterator<T>(c);
}

int main() {
    int x[5] = {10,20,30,40,50};
	list<int> s = { 1, 2, 3, 4, 5 };
 
    copy(x, x+5, back_insert(s));
 
	for( auto& n : s )
        cout << n << endl;
 
	return 0;
}

사실 back_insert를 STL에서 제공한다. -> back_inserter

int main() 
{
    int x[5] = {10,20,30,40,50};
	list<int> s = { 1, 2, 3, 4, 5 };
 
    copy(x, x+5, back_inserter(s));
 
	for( auto& n : s )
        cout << n << endl;
 
	return 0;
}

Front_inserter

#include <iostream>
#include <list>
using namespace std;

int main() {
    int x[5] = {1,2,3,4,5};
	list<int> s = { 0, 0, 0, 0, 0 };
 
    copy(x, x+5, front_inserter(s));
 
	for( auto& n : s )
        cout << n << endl;
 
    // 저장되는 순서가 5 4 3 2 1 0 0 0 0 0임을 주의하자.
    // 생각해 보면 알겠지만 vector는 front_inserter가 없다

	return 0;
}

#include <iostream>
#include <list>
using namespace std;

int main() {
    int x[5] = {1,2,3,4,5};
	list<int> s = { 0, 0, 0, 0, 0 };
 
    copy(x, x+5, inserter(s, ++s.begin()));
 
	for( auto& n : s )
        cout << n << endl;
 
	return 0;
}

inserter 자체를 직접 만들어 보자

#include <iostream>
#include <list>
using namespace std;

int main() 
{
    list<int> s = { 1, 2 };

    eback_insert_iterator<list<int>> p(s);      // 만들어 보자.

    *p = 30;
}
template<typename C>
class eback_insert_iterator
{
    C* container;
public:
    eback_insert_iterator(C& c) : container(&c) {}

    eback_insert_iterator& operator*() { return *this; }
    eback_insert_iterator& operator=(const typename C::value_type& a)
    {
        container->push_back(a);
        return *this;
    }
};

int main() {
    list<int> s = { 1, 2 };

    eback_insert_iterator<list<int>> p(s);

    *p = 30;        // (p.operator*()).operator=(30)-> operator*, operator= 구현필요

    for(auto& n : s)
        cout << n << " ,"; 
}

inserter 자체를 직접 만들어 보자 2

#include <iostream>
#include <list>
using namespace std;

template<typename C>
class eback_insert_iterator
{
    C* container;
public:
    using iterator_category = output_iterator_tag;
    using value_type = void;
    using pointer = void;
    using reference = void;
    using difference = void;
    using container_type = C;

    eback_insert_iterator(C& c) : container(std::addressof(c)) {}

    eback_insert_iterator& operator*() { return *this; }
    eback_insert_iterator& operator++() { return *this; }           // 전위형
    eback_insert_iterator& operator++(int) { return *this; }        // 후위형
    eback_insert_iterator& operator=(const typename C::value_type& a)   // l-value
    {
        container->push_back(a);
        return *this;
    }

    eback_insert_iterator& operator=(const typename C::value_type&& a)  // r-value
    {
        container->push_back(move(a));
        return *this;
    }
};

int main() {
    list<int> s = { 1, 2 };

    eback_insert_iterator<list<int>> p(s);

    *p = 30;

    int x[2] = {1, 2};
    copy(x, x+2, p);        // copy가 가능하게 p++이 가능하게 만들어보자.

    for(auto& n : s)
        cout << n << " ,"; 
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links