Создание специализации шаблонной функции и задача на std::vector

virtus

Здравствуйте,подскажите, пожалуйста: 1.В чем ошибка объявления специализации шаблонной функции в header.h
template <typename T> void VectInfo(const std::vector<T>& ref){
}
 
 
template <> void VectInfo(const Point*&  ref); - здесь ошибка (no instance of function template "VectInfo" matches the specified type)
2. Для vector vChar удалить повторяющиеся последовательности символов. Например, из "aabbbc" оставить "с".Спасибо.
9 ответов

virtus

1.В чем ошибка объявления специализации шаблонной функции в header.h
В том, что тип паметра другой (не const std::vector<> &). Вообще специализация шаблона функции сама по себе довольно бесполезна, попробуй перегрузку.


virtus

Точно! Спасибо! И как не заметил. Нужно было писать так:
template <> void VectInfo(const std::vector<Point*>&  ref){};
А на счет удаления повторяющихся последовательностей символов из vector есть идеи?


virtus

virtus, Именно последовательностей?
std::vector<Point*>::const_iterator new_end = std::unique(ref.begin(), ref.end());
// now range (begin, new_end] contains only unique elements


virtus

ForEveR, как то не стыкуется с
Например, из "aabbbc" оставить "с".


virtus

Да, например:Для std::vector vChar, проинициализированным как "abbbc" нужно получить "ac"; либо для "aasbb" нужно получить "s";


virtus

gray_fox, А. Вот оно че. Ну тогда согласен, не читал первое сообщение.


virtus

В лоб:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
 
int main() 
{
    std::string s = "abbbbcdcwxxx121";  
 
    for( auto it = std::begin(s); it != std::end(s); )
    {
        const char c = *it;
        if( std::count( std::begin(s), std::end(s), c ) > 1 )
        {
            auto pos = std::remove( std::begin(s), std::end(s), c );
            s.erase( pos, std::end(s) );
        } 
        else
        {
            ++it;
        }
    }
    
    std::cout << s << std::endl;
    
    return 0;
}


virtus

А на счет удаления повторяющихся последовательностей символов из vector есть идеи?
ммм... ну вот, смахивает на говнокод, но вроде работает)
Кликните здесь для просмотра всего текста
#include <iterator>
 
 
template<typename Container>
Container unique_only_copy(Container container) {
  auto       first  = std::begin(container); 
  auto const last   = std::end(container);
  
  if (first != last) {
     auto second = std::next(first);
     
     if (second != last) {
        auto result = first;
     
        do {
           if (*first == *second) {
              while (++second != last && *first == *second);
              
              if (second == last) {
                 break;
              }
              
              first = second;
           } else {
              *result++ = *first++;
           }
           
           if (++second == last) {
              *result++ = *first;
           }
        } while (second != last);
        
        container.erase(result, last);
     }
  }
  
  return container;
}
http://ideone.com/ijkgGd


virtus

Спасибо. Буду тестить.