Nested ranges for loops

I have the following code based on the for -loops range (C ++ 11):

 vector<atom> protein; ... for(atom &atom1 : protein) { ... for(atom &atom2 : protein) { if(&atom1 != &atom2) { ... } } } 

Is there a better / cleaner / faster way to write these nested loops? Is there no way to include an if condition in a second loop?

+4
source share
4 answers

Like ronag's answer is a more general version:

 template<typename C, typename Op> void each_unique_pair(C& container, Op fun) { for(auto it = container.begin(); it != container.end() - 1; ++it) { for(auto it2 = std::next(it); it2 != container.end(); ++it2) { fun(*it, *it2); fun(*it2, *it); } } } 

UPDATE

 template<typename C, typename O1, typename O2> void each_value_and_pair(C& container, O1 val_fun, O2 pair_fun) { auto it = std::begin(container); auto end = std::end(container); if(it == end) return; for(; it != std::prev(end); ++it) { val_fun(*it); for(auto it2 = std::next(it); it2 != end; ++it2) { pair_fun(*it2, *it); pair_fun(*it, *it2); } } } 

What is used as follows:

 main() { std::vector<char> values; // populate values // .... each_value_and_pair(values, [](char c1) { std::cout << "value: " << c1 << std::endl;}, [](char c1, char c2){std::cout << "pair: " << c1 << "-" << c2 << std::endl;}); } 
+3
source

Sad, but true. What about regular loops with iterators and the auto keyword?

0
source

I think this may be what you are looking for:

 for(auto it1 = std::begin(protein1); it1 != std::end(protein); ++it1) { for(auto it2 = std::next(it1); it2 != std::end(protein); ++it2) { auto& atom1 = *it1; auto& atom2 = *it2; // ... } } 
0
source

You are a method, it is beautiful. if you want to keep the if statement you can

 vector<atom> protein; int i, j; ... for(i = 0; i < protein.size() : i++) { atom &atom1 = protein.at(i); for(j = i+1; j < protein.size() ; j++) { atom &atom2 = protein.at(j); // Do something // Swap the atom2 and atom1 // Do something again } } 
0
source

Source: https://habr.com/ru/post/1492694/


All Articles