【问题标题】:C++ - Using std::count() with abstract data types?C++ - 将 std::count() 与抽象数据类型一起使用?
【发布时间】:2009-10-10 21:56:16
【问题描述】:

我的代码在我定义的抽象数据类型列表上使用 std::count()。 (英语中的 Sommet 或 Edge)。但它不起作用,尽管我已经像这样重载了

bool operator< (const Sommet &left, const Sommet &right)
{
  if(left.m_id_sommet < right.m_id_sommet)
    return true;

  return false;
}

bool operator== (const Sommet &left, const Sommet &right)
{
  if(left.m_id_sommet == right.m_id_sommet)
    return true;

  return false;
}

请注意,这使用 std::sort() 和 std::unique() 有效。

错误是:

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function 'typename std::iterator_traits<_Iterator>::difference_type std::count(_InputIterator, _InputIterator, const _Tp&) [with _InputIterator = __gnu_cxx::__normal_iterator<Sommet*, std::vector<Sommet, std::allocator<Sommet> > >, _Tp = __gnu_cxx::__normal_iterator<Sommet*, std::vector<Sommet, std::allocator<Sommet> > >]':
Graphe.cpp:43:   instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:422: error: no match for 'operator==' in '__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Sommet*, _Container = std::vector<Sommet, std::allocator<Sommet> >]() == __value'
Sommet.h:7: note: candidates are: bool operator==(const Sommet&, const Sommet&)

谢谢!

编辑

这就是我使用 std::count() 的方式:

 for(vector<Sommet>::iterator iter = m_sommets.begin();
      iter != s_iter_end; iter++)
  {
    iter->SetNbSuccesseurs(count(m_sommets.begin(), m_sommets.end(), iter));
  } 

【问题讨论】:

  • 记住你可以只做return left.m_id_sommet &lt; right.m_id_sommet;而不是if。
  • 同意 GMan 的观点,做虚假的if 是一种糟糕的编码习惯。
  • 确实,下次再做!

标签: c++ stl count operator-overloading


【解决方案1】:

看起来您将迭代器作为最后一个参数传递给 std::count,而您需要传入一个值(通过 const 引用)。

后编辑:看起来我是对的,您传递的是 iter,它是一个迭代器。您需要先取消引用它。尝试传递*iter

【讨论】:

    【解决方案2】:

    你需要传递给count的是一个值,而不是一个迭代器:

    iter->SetNbSuccesseurs(count(m_sommets.begin(), m_sommets.end(), *iter));  
    

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 2011-03-07
      • 2018-10-06
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2013-11-02
      • 2020-10-06
      相关资源
      最近更新 更多