list <T> 개체를 다른 개체에 추가하는 방법


94

C ++에서는 두 개의 list<T>개체가 A있고의 B모든 멤버 BA. 몇 가지 다른 소스를 검색했지만 간단한 해결책 (ei A.append(B);)을 찾지 못했고 이것은 저를 약간 놀라게합니다.

이를 수행하는 가장 좋은 방법은 무엇입니까?

그렇게되면 B에 대해서는 신경 쓰지 않습니다 (다음 줄에서 삭제됨). 더 나은 성능을 위해이를 활용할 수있는 방법이 있다면 그것에 관심이 있습니다.

답변:


195

B 에있는 항목의 사본 을 추가 하려면 다음을 수행 할 수 있습니다.

a.insert(a.end(), b.begin(), b.end());

B의 항목 을 A의 끝 으로 이동 하려면 (동시에 B를 비우기) 다음을 수행 할 수 있습니다.

a.splice(a.end(), b);

귀하의 상황에서 스 플라이 싱은 연결 목록에서 몇 가지 포인터를 조정하는 것만 포함하므로 더 좋을 것입니다.


8
+1. 그렇습니다. 그것은 "슬라이스"지도와 세트 ... 너무 쉽고 효율적으로 수 있었던 경우
paercebal

이 작업 중 하나가 O (1)입니까?
Chris Redford 2013 년

2
위의 경우 splice가 O (1)이어야한다고 생각합니다.
chunkyguy

9
a.splice(a.end(), b)a.splice(a.end(), b, it_b_start)에 대해서는 O (1) 이지만에는 O (n)입니다 a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai

10
왜, 왜 STL이 a.append (b)를 지원할 수 없습니까?
2017

-3

부스트를 사용한 한 가지 예

std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure

// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.