문제

컨테이너가있는 경우 (vector, list, 각 요소는 a std::pair, 각 쌍의 각 요소를 반복하는 쉬운 방법이 있습니까?

std::vector<std::pair<int,int> > a;
a.push_back(std::pair(1,3));
a.push_back(std::pair(2,3));
a.push_back(std::pair(4,2));
a.push_back(std::pair(5,2));
a.push_back(std::pair(1,5));

그리고 그 가치를 반복 할 수 있습니다 : 1,3,2,3,4,2,5,2,1,5?

마찬가지로, 위와 같이 쌍 요소의 평평한 목록이있는 컨테이너 (동일한 유형)의 어떤 유형의 functor/function이 나에게 반환됩니까?

도움이 되었습니까?

해결책

두 번째 컨테이너로 쌍의 용기를 평평하게하려면 간단히 자신의 삽입기를 쓸 수도 있습니다.

template<class C>
struct Inserter {
    std::back_insert_iterator<C> in;
    Inserter(C& c) : in(c) {}
    void operator()(const std::pair<typename C::value_type, typename C::value_type>& p)
    {
        *in++ = p.first;
    *in++ = p.second;
    }
};

template<class C>
Inserter<C> make_inserter(C& c)
{ 
    return Inserter<C>(c); 
}

// usage example:
std::list<int> l;
std::for_each(a.begin(), a.end(), make_inserter(l));

다른 팁

처음에는 자신의 반복자 클래스를 만들어야합니다.이 클래스는 쌍 내 위치를 container<pair> 반복자

두 번째로, 당신이 원하는만큼 일반적이지만 (동일한 유형의 컨테이너)가 필요합니다. 템플릿 typedef. 여기 벡터에 대한 다음은 다음과 같습니다.

template <class V>
std::vector<V> flatten_pairs(std::vector<std::pair<V,V> > const& a) {
  typedef std::vector<std::pair<V,V> > A;
  std::vector<V> ret;
  for (typename A::const_iterator i=a.begin(),e=a.end();i!=e;++i) {
    ret.push_back(i->first);
    ret.push_back(i->second);
  }
  return ret;
}

다음은 템플릿 Typedef를 속이는 방법입니다.

template <class C>
struct same_container;

template <class V>
struct same_container<std::vector<V> > {
  template <class W> struct rebind { typedef std::vector<W> type; };
};

template <class V>
struct same_list<std::list<V> > {
  template <class W> struct rebind { typedef std::list<W> type; };
};

template <class C>
typename same_container<C>::rebind<typename C::value_type::first_type>::type
flatten_pairs(C const& a);

다음 코드는 필요에 따라 모든 값을 인쇄합니다.

for ( size_t x = 0; x < a.size(); ++x ) {
    cout << a[x].first << "," << a[x].second << ",";
}

나는 사용자 정의 반복기를 만드는 것 보다이 쉬운 방법을 선호합니다.

원하는 반복을 수행하는 간단한 방법은 없지만 부스트 :: iterator_adaptor 라이브러리를 살펴 보거나 자신의 반복자를 구현하여이를 수행 할 수 있습니다 (너무 복잡하지 않아야 함). 그런 다음 두 번째 질문에서는 새 반복자 어댑터와 함께 std :: 복사를 사용할 수 있습니다.

아니요, 실제로 그런 것이 없습니다 std::pair. 대신 부스트 튜플을 사용하는 것을 고려할 수 있습니다. 튜플은 확장 된 버전과 비슷합니다. std::pair 이를 통해 임의의 요소 수를 허용하고 (어느 한계까지, 일반적으로 10 이상) 요소에 벡터/배열과 같은 요소에 액세스 할 수 있습니다 (즉, 이름 또는 색인으로 요소에 액세스 할 수 있음).

TR1에는 Boost의 튜플의 하위 집합 인 STD :: TR1 :: TUPEL도 포함하지만 메모리가 제공되는 경우 여전히 요구하는 이름/색인 기능이 포함됩니다.

편집 : 두 경우 모두 인덱스 표기법에는 컴파일 타임 인덱스에 대한 상수이므로 튜플의 요소를 반복하기 위해 (런타임) 루프를 작성할 수는 없지만 약간의 메타 프로 그램으로 작업을 수행 할 수 있습니다. 부스트 퓨전에는 필요한 것을 지원하기 위해 약간의 도움이 포함되어 있습니다 (이상한 일치로 튜플은 퓨전 라이브러리의 일부입니다).

어느 시점에서 사용해야합니다 첫 번째 그리고 , 자신의 반복자 클래스를 만들더라도. 나는 그 방법이 없다고 생각하지 않습니다 (적어도 휴대용으로).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top