繁体   English   中英

迭代器操作不起作用

[英]iterator operations not working

出于某种原因,在此函数中,它会计算两个或多个相同值的“块”:

#include <iostream>
#include <iterator> 
#include <set>

int countClumps(multiset<int> set)
{
    int clumps = 0;

    for (multiset<int>::const_iterator iter(set.begin()), end(set.end()); iter != end; ++iter)
    {
        if (iter == iter[1] && iter != iter[-1])
        {
            clumps += 1;
        }
    }
    return clumps;
}

我收到错误“没有运算符'[]'与这些操作数匹配”。 为什么会这样? 我认为像iter [i]和*(iter + i)之类的东西是标准操作? 我确实尝试过*(iter + 1),但这给了我相同的操作数错误,但带有+。 有什么我忘了包括的东西吗?

我收到错误“没有运算符'[]'与这些操作数匹配”。 为什么会这样?

这是因为multiset<int>::const_iterator不支持operator[]

我认为像iter[i]*(iter + i)是标准操作?

你错了

我确实尝试过*(iter + 1)但这给了我相同的操作数错误,但带有+ 有什么我忘了包括的东西吗?

multiset<int>::const_iteratorint之间不支持operator+ 因此, iter + 1不是有效的表达式。

您没有忘记添加任何内容。 您正在尝试对象类型不支持的操作。

您将不得不重新考虑您的代码。


遵循以下实现方式的东西应该起作用。

int countClumps(multiset<int> set)
{
   int clumps = 0;
   int previousNumber = 0;

   multiset<int>::const_iterator iter(set.begin());
   multiset<int>::const_iterator end(set.end());

   // Account for empty input.
   if ( iter != end )
   {
      previousNumber = *iter;

      for (++iter; iter != end; )
      {
         if ( previousNumber == *iter )
         {
            ++clumps;

            // Skip the rest of the clump
            for ( ++iter; iter != end && previousNumber == *iter ; ++iter );
         }
         else
         {
            ++iter;
         }

         if ( iter != end )
         {
            previousNumber = *iter;
         }

      }
   }
   return clumps;
}

std::multiset具有双向迭代器。 您不能在此迭代器中使用operator []operator + 使用标准函数std::nextstd::prev来获取上一个或下一个迭代器。

另外,您应该比较迭代器指向的值,而不是迭代器本身。

考虑到如果将参数声明为引用,那会更好。

该函数可以如下所示

#include <iostream>
#include <set>

size_t countClumps( std::multiset<int> &set )
{
    size_t clumps = 0;

    for ( auto first = set.begin(), last = set.end(); first != last; )
    {
        auto value = *first;
        size_t i = 0;

        while ( ++first != last && *first == value ) ++i;

        if ( i ) ++clumps;
    }

    return clumps;
}

int main() 
{
    std::multiset<int> set { 1, 1, 2, 3, 3, 3, 5, 5 };

    std::cout << countClumps( set ) << std::endl;

    return 0;
}

程序输出为

3

的问题是,一个std::multiset<>::const_iteratorbidirectional_iterator ,它不支持引用操作,不像random_access_iterator

您可以执行以下操作:

if (set.length() > 2)
    for (multiset<int>::const_iterator iter(std::next(set.begin())), end(std::prev(set.end())); iter != end; ++iter)
    {
        if (*iter == *std::next(iter) && *iter != *std::prev(iter))
        {
            clumps += 1;
        }
    }

但是您的算法仍然错误...我愿意(未经测试):

bool first_time = true;
bool in_clump = false;
int prev_val;
for (auto element: set)
{
    if (first_time)
    {
        prev = element;
        first_time = false;
    }
    else if (element == prev)
    {
        if (!in_clump)
        {
            ++clumps;
            in_clump = true;
        }
    }
    else
    {
        in_clump = false;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM