[英]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_iterator
和int
之间不支持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::next
和std::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_iterator
是bidirectional_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.