Combine
void combine_traverse(const std::list<int> left, const std::list<int> right, std::list<std::list<int> >& output) {
std::list<int>::const_iterator vBegIt, vEndIt ;
vBegIt = right.begin() ;
vEndIt = right.end() ;
std::list<int> r = right ;
for(; vBegIt != vEndIt; ++vBegIt) {
std::list<int> l = left ;
r.pop_front() ;
l.push_back(*vBegIt) ;
combine_traverse(l, r, output) ;
output.push_back(l) ;
}
}
Arrange
void arrange_traverse(const std::list<int> left, const std::list<int> right, std::list<std::list<int> >& output) {
std::list<int>::const_iterator vBegIt, vEndIt ;
vBegIt = right.begin() ;
vEndIt = right.end() ;
size_t curSize = 0 ;
for(; vBegIt != vEndIt; ++vBegIt,++curSize) {
std::list<int> l = left ;
l.push_back(*vBegIt) ;
std::list<int> r = right ;
std::list<int>::iterator it = r.begin() ;
for(size_t i = 0 ; i < curSize; ++i) {
++it ;
}
r.erase(it) ;
arrange_traverse(l, r, output) ;
}
if(right.size() == 0) {
output.push_back(left) ;
}
}
Test
int main() {
std::list<int> left, right;
right.push_back(1) ;
right.push_back(2) ;
right.push_back(3) ;
std::list<std::list<int> > output ;
combine_traverse(left, right, output) ;
// arrange_traverse(left, right, output) ;
std::list<std::list<int> >::iterator outBegIt, outEndIt ;
outBegIt = output.begin() ;
outEndIt = output.end() ;
std::list<int>::iterator inBegIt, inEndIt ;
for(; outBegIt != outEndIt; ++outBegIt) {
inBegIt = (*outBegIt).begin() ;
inEndIt = (*outBegIt).end() ;
for(; inBegIt != inEndIt; ++inBegIt) {
std::cout << *inBegIt << "\t" ;
}
std::cout << std::endl ;
}
}