C ++ - Использование std :: count () с абстрактными типами данных? - PullRequest
1 голос
/ 11 октября 2009

Мой код использует std :: count () в списке абстрактного типа данных, который я определил. (Sommet или Edge на английском языке). Но это не работает, хотя я перегрузил операторы <и == следующим образом: </p>

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&)

Спасибо!

EDIT

Вот как я использовал 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));
  } 

Ответы [ 2 ]

2 голосов
/ 11 октября 2009

Похоже, что вы передаете итератор в качестве последнего параметра std::count, тогда как вам нужно передать значение (по константной ссылке).

Постредактирование: похоже, я был прав, вы передаете iter, что является итератором. Вы должны разыменовать это сначала. Попробуйте вместо *iter.

2 голосов
/ 11 октября 2009

То, что вам нужно передать count, это значение, а не итератор:

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