关于C ++的家庭作业,我有三个问题。目标是创建一个简单的回文方法。这是我的模板:
#ifndef PALINDROME_H
#define PALINDROME_H
#include <vector>
#include <iostream>
#include <cmath>
template <class T>
static bool palindrome(const std::vector<T> &input)
{
std::vector<T>::const_iterator it = input.begin();
std::vector<T>::const_reverse_iterator rit = input.rbegin();
for (int i = 0; i < input.size()/2; i++, it++, rit++)
{
if (!(*it == *rit)) {
return false;
}
}
return true;
}
template <class T>
static void showVector(const std::vector<T> &input)
{
for (std::vector<T>::const_iterator it = input.begin(); it != input.end(); it++) {
std::cout << *it << " ";
}
}
#endif
关于上面的代码,你能在for循环的第一部分声明多个迭代器吗?我尝试在palindrome()方法中定义“it”和“rit”,并且在rit之前我一直收到关于需要“,”的错误。但是当我在for循环外部剪切和粘贴时,编译器没有错误。 (我正在使用VS 2008)。
第二个问题,我几乎只是对这个问题大放异彩。但是我在palindrome()方法中使用return语句的方式好吗?在我的脑海中,我认为它的工作原理是,一旦* it和* rit彼此不相等,那么函数返回false,此时该方法退出。否则,如果它一直通过for循环,那么它在结束时返回true。如果我曾经在我的书中找到一个很好的例子,我找不到一个很好的例子,我完全放弃了返回语句如何工作的大脑。
最后,我收到了这个警告:
\palindrome.h(14) : warning C4018: '<' : signed/unsigned mismatch
现在是因为我运行我的for循环直到(i&lt; input.size()/ 2)并且编译器告诉我输入可能是负数?谢谢!
答案 0 :(得分:8)
迭代器是家庭作业的要求吗?此任务可以简化为对std::equal
:
template <class T>
bool palindrome(const std::vector<T> &input)
{
return equal(input.begin(), input.begin()+input.size()/2, input.rbegin());
}
答案 1 :(得分:5)
你能在for循环的第一部分声明多个迭代器吗?
是的,但它们必须属于同一类型,因此您无法同时声明const_iterator
和const_reverse_iterator
。
是我在palindrome()方法中使用return语句的方法吗?
是的,虽然为什么不比较*it != *rit
?
palindrome.h(14) : warning C4018: '<' : signed/unsigned mismatch
i
已签署; std::vector::size()
返回无符号值。如果i
未签名,则不会收到此警告。
但是作为一个建议:使用两个前向迭代器可能更简单。将一个初始化为.begin()
,将另一个初始化为.end() - 1
。然后,您可以递增第一个并递减第二个,并且您的循环测试只会变为it1 < it2
。类似于以下(完全未经测试的)for循环:
for (iterator it1(v.begin()), it2(v.end() - 1); it1 < it2; ++it1, --it2)
这样您就不再需要单独的i
计数器和比较;一切都是用迭代器完成的。
答案 2 :(得分:0)
当迭代器属于同一类型时,for
循环对我有用,我还没有想出其他方法 - 除了像你做的那样在外面初始化它们之外:
typedef vector<char>::const_iterator IT;
for (IT it(vchars.begin()), end(vchars.end()); it != end; ++it)
{
cout << *it << endl;
}
关于return语句,你的推理是正确的,但是你从那两个不相同的迭代器开始,一个从最后开始,另一个从前面开始。所以在第一次迭代中它们不相等而你返回 false - 我相信。
最后,警告指出size()
返回无符号类型(大小不能为负)这一事实,但您要与带符号值i
进行比较,这在大多数情况下不是真实的问题 - 但要整洁,你可以宣布你的i
为无符号。
这将解决这个问题:
for (unsigned int i = 0; i < input.size()/2; ...)