【问题标题】:Function template palindrome that takes a vector parameter带有向量参数的函数模板回文
【发布时间】:2013-11-28 11:16:52
【问题描述】:

我开始学习 C++ 和 STL。 我有一个问题:

写一个函数模板palindrome,接受一个向量参数,返回true或false来检查向量是否是回文(12321是回文,1234不是回文)

这是我的代码:

template<class T>
bool palindrome(vector<T> & v)
{ 
  int i,j;
  for( i=0,j=v.size();i<v.size()/2;i++,j--)
  {
      if(v[i]!=v[j]) 
      return false;
  }

  return true;
}

void main()
{
  int ar[]={1,2,3,2,1};
  vector<int> v(ar,ar+5);
  cout<<palindrome(v);
}

代码不起作用。我知道它有一些错误,但我不知道如何解决它们。请帮我! 非常感谢!

【问题讨论】:

  • 确切的错误信息是什么?你期望什么输出,你得到什么输出?
  • 尝试使用迭代器 rbegin,而不是使用 size(),这不是迭代向量的最佳方式。
  • main 应该返回一个 int,而不是 void。
  • 您可以只使用双向迭代器方法,使用template&lt;typename Iterator&gt; palindrome(Iterator begin, Iterator end) 并传递v.begin()v.end()。只是一个想法。

标签: c++ templates vector stl


【解决方案1】:

您的索引不正确。在您的循环中j=v.size(),然后您访问v[j]。但最后一个元素位于索引 v.size() - 1。您的程序行为将是未定义的。

更改为j=v.size() -1

【讨论】:

  • 可能比我的答案更好,而且更快。但是,访问超出数组末尾的元素以进行读取很少会导致执行崩溃。
  • 哦,这是一个愚蠢的错误。非常感谢。代码运行良好。
【解决方案2】:

最明显的错误在:for( i=0,j=v.size();i&lt;v.size()/2;i++,j--)

你需要j=v.size()-1

【讨论】:

    【解决方案3】:

    或者你可以利用你对 STL 的掌握来直接压缩它,并让它适用于列表和其他东西。

    template<class T> bool palindrome(T & v){
        return std::equal(v.begin(),v.end(),v.rbegin());
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多