Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

Наследование от std::basic_string - C++

12.06.2014, 18:28. Просмотров 363. Ответов 4
Метки нет (Все метки)

Суть задачки: надо с текста считать слова через istream_iterator откидывая знаки пунктуации в конце слов. Написал вот так, отнаследовав от std::basic_string. В принципе, все работает, но правильно ли так делать? Какие еще способы кто может предложить?
Была еще идея писать свой istream_iterator, но там код слишком длинный получается ради такой простой задачки. Может есть что то такое в boost? Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <string>
#include <iterator>
#include <sstream>
#include <vector>
#include <algorithm>
 
template <typename CharT,
          typename Traits = std::char_traits<CharT>,
          typename Allocator = std::allocator<CharT>>
class basic_string_adapter : public std::basic_string<CharT, Traits, Allocator>
{
   using basic_str = std::basic_string<CharT, Traits, Allocator>;
public:
   using basic_str::basic_str;
   using basic_str::operator =;
 
   friend
   std::basic_istream<CharT, Traits>&
   operator>>(std::basic_istream<CharT, Traits>& is,
              basic_string_adapter<CharT, Traits, Allocator>& str)
   {
      //is >> str;
      basic_str temp;
      is >> temp;
      auto pos = std::find_if(temp.begin(), temp.end(), ::ispunct);
      temp.erase(pos, temp.end());
      str = std::move(temp);
      return is;
   }
};
 
int main()
{
   std::istringstream iss{"one, two,, three; four: five"};
   using mystring = basic_string_adapter<char>;
   std::vector<mystring> v{std::istream_iterator<mystring>(iss), std::istream_iterator<mystring>()};
   for (auto s : v) std::cout << s << " ";
 
   system("pause");
   return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 18:28     Наследование от std::basic_string
Посмотрите здесь:

Std::basic_string в MSVC - C++
Как обстоят дела с stl строками в MS Visual C++ (например в 2013 версии). Конкретно интересует, используется ли для них COW механизм?...

Ошибка: no matching function for call to 'Slovare<std::basic_string<char> >::show()' - C++
Помогите исправить ошибку. Программа должна при нажатии 3 выводить итог, но при построении выходит ошибка как раз в этой строчке:...

Наследование от std::ostream - C++
Имеем код: #include &lt;iostream&gt; class DebugMessage : public std::ostream { public: DebugMessage() : std::ostream(...

что использовать std::cout или просто using namespace std? - C++
Приветствую! Сейчас учу С++, постигаю азы так сказать. В арсенале две книги - Джефф Кент, &quot;Основы программирования &quot; и Х.М....

Как можно еще использовать std::placeholders вне в связки с std::bind? - C++
Добрый день! Как можно еще использовать std::placeholders вне в связки с std::bind?

зачем часто писать std:: если можно один раз using namespace std? - C++
зачем часто писать std:: если можно один раз using namespace std?

Стандартный поток и STL (std::copy to std::cout) - C++
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;algorithm&gt; #include &lt;functional&gt; #include &lt;string&gt; using namespace std; ...

Почему std::string_view МЕДЛЕННЕЕ, чем std::string? - C++
Всем привет! Нужно найти количество уникальных строк в больших текстовых файлах (размером до нескольких гигабайт). Почему в...

Стоит ли очищать в деструкторе std::map , std::vecotor? - C++
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу программы как то заполняются, нужно ли мне...

статическая и динамическая матрица на std::array and std::vector - C++
Всем привет. Решил немного поиграться с шаблонами. Скилл чуть больше 0. Можно ли с помощью шаблонной магии подставить вместо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
12.06.2014, 19:07     Наследование от std::basic_string #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Можно в locale потока поменять facet, чтобы пунктуация считалась пробелами. Вот недавно писал похожее:
http://www.cyberforum.ru/showthread.php?p=6301012
Хотя тоже не знаю, не слишком ли это для такой задачи.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 19:13     Наследование от std::basic_string #3
Цитата Сообщение от DiffEreD Посмотреть сообщение
отнаследовав от std::basic_string.
Он не предназначен для наследования.
Почему бы по-простому не считать слова как есть, а уже после удалить знаки пунктуации в конце?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 19:28     Наследование от std::basic_string #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Он не предназначен для наследования.
Почему?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 19:38     Наследование от std::basic_string #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему?
Как минимум по причине отсутствия виртуального деструктора.
Yandex
Объявления
12.06.2014, 19:38     Наследование от std::basic_string
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru