【问题标题】:Get Next Element in the std::list using iterator使用迭代器获取 std::list 中的下一个元素
【发布时间】:2018-04-13 09:54:38
【问题描述】:

我正在尝试获取 std::list 中连续元素之间的差异。我尝试了以下解决方案,但正如this 线程所说,我需要制作迭代器的副本并增加它。不确定这是什么意思,因为向迭代器添加数字也会导致错误。我在这里想念什么。我使用的是以前版本的 C++,但不是 C++ 11

#include "stdafx.h"
#include <list>
#include <iostream>
using namespace std;

int main()
{
    std::list<int> myList;
    //for (int i = 10;i < 15;i++)
    myList.push_back(12);
    myList.push_back(15);
    myList.push_back(18);
    myList.push_back(19);
    myList.push_back(25);

    for (std::list<int>::const_iterator itr = myList.begin();itr != myList.end();++itr)
    {
        int x = *itr;
        int y = *(itr + 1);
        int diff = std::abs(x - y);
        cout << diff << "\n";
    }

    return 0;
}

【问题讨论】:

标签: c++ stl


【解决方案1】:

使用adjacent_difference 怎么样?

std::adjacent_difference(myList.begin(), myList.end(), tempList );

See Here


如果您对实现感兴趣,请查看附加链接中Possible Implementation 部分的实现方式。您所要做的就是用列表迭代器替换,输出只显示在屏幕上,或者存储它。

【讨论】:

  • 这会有一个额外的第一个元素。对吧?
  • @GauravSehgal 是啊,看看算法,你总是可以在一些检查之后打印开始的第二个索引
【解决方案2】:

使用增量运算符移动迭代器。

auto x = itr;
auto y = itr;
if(++y!=myList.end())
{
    int diff = std::abs(*x - *y);
    cout << diff << "\n";
}

【讨论】:

  • 我认为这给出了列表中第一个元素和其余元素之间的差异,而不是连续元素之间的差异。
  • @Programmerzzz 这个答案对你来说很快。 Mayur 重新调整了用途并重新输入了 xy。这可行,但需要一些解释。
【解决方案3】:

您可以复制迭代器并运行两个,但我认为在循环之外获取第一个值然后使用循环遍历第二个值更容易,在继续下一个之前用第二个值重置第一个值.

类似这样的:

#include <list>
#include <iostream>

int main()
{
    std::list<int> myList;
    myList.push_back(12);
    myList.push_back(15);
    myList.push_back(18);
    myList.push_back(19);
    myList.push_back(25);
    std::list<int>::const_iterator itr = myList.begin();
    if(itr != myList.end()) // is a first value
    {
        int last = *itr; // cache it
        for (itr++; itr != myList.end(); itr++) // get next value
        { 
            int current = *itr; //cache it
            int diff = std::abs(last - current);
            std::cout << diff << "\n";
            last = current; // update last value
        }
    }
    return 0;
}

【讨论】:

    【解决方案4】:

    您可以使用std::advance() 进入下一个迭代器

    int x = *itr;
    std::list<int>::const_iterator itr2 = itr;
    std::advance(itr2,1);
    if(itr2==myList.end())
        break;
    int y = *(itr2);
    int diff = std::abs(x - y);
    cout << diff << "\n";
    

    编辑:如果c++ 11 可用,请参阅std::next

    【讨论】:

    • 哦,对不起,我使用的是以前版本的 C++,但不是 C++11
    • @Programmerzzz 最好将其添加到问题中,以便每个人都可以看到它。否则你会得到更多这样的答案。
    【解决方案5】:
    #include <list>
    #include <iostream>
    
    int main()
    {
        std::list<int> myList;
        //for (int i = 10;i < 15;i++)
        myList.push_back(12);
        myList.push_back(15);
        myList.push_back(18);
        myList.push_back(19);
        myList.push_back(25);
        for (std::list<int>::const_iterator itr = myList.begin();
                                  itr != std::prev(myList.end());
                                                          ++itr)
        {
            std::list<int>::const_iterator nextIt = std::next(itr);
            int diff = *itr - *nextIt;
            std::cout << diff << "\n";
        }
    
        return 0;
    }
    

    使用std::next(itr) 获取下一个迭代器 并在 for 循环中使用 std::prev(myList.end()) 来获取列表中最后一个元素的前一个元素。

    您还可以更改 for 循环并使用 std::advance() 获取下一个迭代器,而无需使用 std::nextstd::prev

    std::list<int>::const_iterator itr = myList.begin();
    while (true)
    {
        int prevValue= *itr;
        std::advance(itr, 1);
        if (itr == myList.end())
        {
            break;
        }
        int diff = prevValue - *itr;
        std::cout << diff << "\n";
    
    }
    

    【讨论】:

      【解决方案6】:

      另一种方法是简单地跟踪前一个列表元素的值,而不是迭代器,然后从迭代器当前指向的元素中减去前一个值;像这样:

      #include <list>
      #include <cmath> // need cmath for std::abs
      #include <iostream>
      using namespace std;
      
      int main()
      {
        std::list<int> myList;
        //for (int i = 10;i < 15;i++)
        myList.push_back(12);
        myList.push_back(15);
        myList.push_back(18);
        myList.push_back(19);
        myList.push_back(25);
        int PreviousElement = 0;
        bool Start = false;
        for (std::list<int>::const_iterator itr = myList.begin(); itr != myList.end(); ++itr)
        {
          if (Start)
          {
            int diff = std::abs(*itr - PreviousElement);
            cout << diff << "\n";
          }
          else
          {
            Start = true;
          }
          PreviousElement = *itr;
        }
      
        return 0;
      }
      

      【讨论】:

        【解决方案7】:

        我认为你需要两个迭代器来解决这个问题 这是我的代码

        #include "stdafx.h"
        #include <list>
        
        #include <iterator>
        #include <iostream>
        
        using namespace std;
        
        int main()
        {
            std::list<int> myList;
            //for (int i = 10;i < 15;i++)
            myList.push_back(12);
            myList.push_back(15);
            myList.push_back(18);
            myList.push_back(19);
            myList.push_back(25);
            int x = 0;
            int y = 0;
            std::list<int>::iterator itr;
            std::list<int>::iterator it_next;
        
            for (itr = myList.begin(), it_next = ++myList.begin();it_next != myList.end();itr++, it_next++)
            {
        
                x = *itr;
                y = *it_next;
                int diff = abs(x - y);
                cout << diff << "\n";
            }
        
            system("PAUSE");
            return 0;
        }
        

        我在 VC++2005 中构建它,但在 C++ 中应该可以正常工作
        希望这会对你有所帮助:)

        【讨论】:

        • 这些代码的结果应该类似于this
        猜你喜欢
        • 2011-02-11
        • 2011-02-10
        • 2023-03-14
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多