簡體   English   中英

嵌套的基於范圍的for循環

[英]Nested range-based for-loops

我有使用范圍基於下面的代碼for -loops(C ++ 11):

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

是否有更好/更清潔/更快的方式來編寫這個嵌套循環? 是不是有辦法在第二個循環中包含if條件?

與ronag相似的答案是更通用的版本:

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);
        }
    }
}

使用方式如下:

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;});
}

傷心但真實。 如何使用迭代器和auto關鍵字進行正常循環?

我想這可能就是你要找的東西:

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;

           // ...
    }
}

你的方法很好。 如果你想保存if語句,你可以

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM