C++ 基于嵌套范围的for循环

C++ 基于嵌套范围的for循环,c++,for-loop,c++11,nested-loops,C++,For Loop,C++11,Nested Loops,我为-循环(C++11)使用了以下基于范围的代码: 载体蛋白; ... for(原子和原子1:蛋白质){ ... for(原子和原子2:蛋白质){ 如果(&atom1!=&atom2){ ... } } } 有没有更好/更干净/更快的方法来编写这个嵌套循环?是否有办法将if条件包含在第二个循环中?悲伤但正确。 使用迭代器和自动关键字的普通循环如何?我想这可能就是您要寻找的: for(auto it1 = std::begin(protein1); it1 != std::end(protein

我为-循环(C++11)使用了以下基于范围的
代码:

载体蛋白;
...
for(原子和原子1:蛋白质){
...
for(原子和原子2:蛋白质){
如果(&atom1!=&atom2){
...
}
}
}
有没有更好/更干净/更快的方法来编写这个嵌套循环?是否有办法将
if
条件包含在第二个循环中?

悲伤但正确。
使用迭代器和自动关键字的普通循环如何?

我想这可能就是您要寻找的:

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
    }
}
载体蛋白;
int i,j;
...
对于(i=0;i
与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);
        }
    }
}
模板
作废每个_唯一_对(C&container,Op fun)
{
for(auto it=container.begin();it!=container.end()-1;++it)
{
for(auto it2=std::next(it);it2!=container.end();++it2)
{
乐趣(*it,*it2);
乐趣(*it2,*it);
}
}
}
更新

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);
        }
    }
}
模板
作废每个价值和价值对(C&container、O1 val\u fun、O2 pair\u fun)
{
auto it=std::begin(容器);
自动结束=标准::结束(容器);
if(it==end)
返回;
for(;it!=std::prev(end);+it)
{
val_fun(*it);
for(自动it2=std::next(it);it2!=end;+it2)
{
配对游戏(*it2,*it);
配对乐趣(*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;});
}
main()
{
std::向量值;
//填充值
// ....
每个_值_和_对(值,


[](字符c1){std::cout“更快”?越快的是,一旦你写了这个,就不要浪费时间重写它。它没那么糟糕。你可以为严格的上三角编写传统的
for
循环,然后将两个经过转换的语句放入正文中。你可以编写for循环而不是foreach循环,然后执行“for”(j=i+1…’并保存if条件for(auto a=std::begin(arr);a!=std::end(arr);++a)\\下一行for(auto b=a+1;b!=std::end(arr);++b)不一样。if条件在第二个循环中。既然编辑了它(为什么不将其包含在应答中而不是注释中?),它的迭代次数只有原始代码的一半左右,因此它的行为与原始代码不同。是的,它的迭代次数只有原始代码的一半左右。但在大多数情况下,这是正常的,但这并不是做同样的事情。更像是
it2=std::next(it1)
。这不一样。它只有大约一半的迭代次数。但我只想要对角线,而不仅仅是上面的三角形。@R.MartinhoFernandes:的确;这个(以及其他类似的答案)缺少的是,你需要循环体是
用(atom1,atom2)填充;用(atom2,atom1)填充
获取原始行为。@MikeSeymour实际上我不能
用(atom1,atom2)填充;用(atom2,atom1)填充;
因为我在for循环之间有特定于atom1的代码。这不一样。它只有大约一半的迭代次数。但我只需要对角线,而不需要上三角形。@LiranElisha现在它只通过下三角形循环:S@R.MartinhoFernandes你说得对。那是我做快速编辑的错。只要做两次就行了无论你想做什么,除非是按照特定的顺序更改项目,然后我就不想做了。这不一样。我只想要对角线,而不仅仅是上面的三角形!为了最大的通用性,它应该是
std::prev(std::end(container))
而不是
container.end()-1
;而且你还需要正确处理空容器。@彼得:不,这还是不一样的,正如我对米凯泽莫尔说的,for循环之间有特定于atom1的代码。@Kyle_黑客啊,我第一次读你的帖子时错过了这个细微差别。我不确定通用版本对这种情况是否有用。我在or下面贴了一个原始代码只用于踢。
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;});
}