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

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

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

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

12.06.2014, 18:28. Просмотров 374. Ответов 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;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 18:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование от std::basic_string (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*') - C++
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

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(...

4
Somebody
2789 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
12.06.2014, 19:07 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Можно в locale потока поменять facet, чтобы пунктуация считалась пробелами. Вот недавно писал похожее:
http://www.cyberforum.ru/showthread.php?p=6301012
Хотя тоже не знаю, не слишком ли это для такой задачи.
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 19:13 #3
Цитата Сообщение от DiffEreD Посмотреть сообщение
отнаследовав от std::basic_string.
Он не предназначен для наследования.
Почему бы по-простому не считать слова как есть, а уже после удалить знаки пунктуации в конце?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 19:28 #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Он не предназначен для наследования.
Почему?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 19:38 #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему?
Как минимум по причине отсутствия виртуального деструктора.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2014, 19:38
Привет! Вот еще темы с ответами:

Создание своего класса исключений, наследование std::exception - C++
хотел создать свой класс исключений пронаследовав от std::exception, но немного запутался в конструкторах... конструктор же не наследуется,...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream - C++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

STL std::set, std::pair, std::make_pair - C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
12.06.2014, 19:38
Ответ Создать тему
Опции темы

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