我有一个deque<int>
,我想知道两个相等数字之间int
的数量是否均匀。例如:7,13,4,6,4,13,8,10
应为false,1,3,5,3,4,8,7,9,6,5,7
应为true。我认为我的程序是正确的,但或者某种原因它在两种情况下都输出了。有什么想法吗? PS:我对迭代器不太满意。
#include <iostream>
#include <deque>
using namespace std;
bool isJoined ( deque<int>::iterator begin, deque<int>::iterator end )
{
for(auto i = begin ; i < end ;i++)
for(auto j=i+1;j<end;j++)
if(*i == *j && (j-i)%2 == 0)
return true;
return false;
}
int main()
{
deque<int> test = {1,3,5,3,4,8,7,9,6,5,7};
deque<int> test2 = {7,13,4,6,4,13,8,10};
cout<<isJoined(test.begin(),test.end())<<endl;
cout<<isJoined(test2.begin(),test2.end())<<endl;
}
答案 0 :(得分:0)
这里有一个错误的错误:
if(*i == *j && (j-i)%2 == 0)
你想要在迭代器之间严格计算数字的数量......那是[1, 2, 3, 1]
你想要的2
,但是迭代器之间的区别会给你3
。因此,你想要:
if (*i == *j && (j-i+1)%2 == 0)
或
if (*i == *j && (j-i)%2 == 1)
另外,您可能会发现使用索引运算符更容易,并完全避免使用迭代器:
bool isJoined(const deque<int>& deq)
{
for (size_t i = 0; i < deq.size(); ++i) {
for (size_t j = i+1; j < deq.size(); ++j) {
if (deq[i] == deq[j] && (j-i)%2 == 1) {
return true;
}
}
}
return false;
}
这样也可以让你跨越内循环:
for (size_t j = i+1; j < deq.size(); j += 2) {
// already enforcing an even number of numbers in bewteen
if (deq[i] == deq[j]) return true;
}