Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
1

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

12.06.2014, 18:28. Просмотров 943. Ответов 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
Ответы с готовыми решениями:

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

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char,...

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

Std::basic_string в MSVC
Как обстоят дела с stl строками в MS Visual C++ (например в 2013 версии)....

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

4
Somebody
2802 / 1613 / 251
Регистрация: 03.12.2007
Сообщений: 4,215
Завершенные тесты: 3
12.06.2014, 19:07 2
Лучший ответ Сообщение было отмечено DiffEreD как решение

Решение

Можно в locale потока поменять facet, чтобы пунктуация считалась пробелами. Вот недавно писал похожее:
http://www.cyberforum.ru/showthread.php?p=6301012
Хотя тоже не знаю, не слишком ли это для такой задачи.
1
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 19:13 3
Цитата Сообщение от DiffEreD Посмотреть сообщение
отнаследовав от std::basic_string.
Он не предназначен для наследования.
Почему бы по-простому не считать слова как есть, а уже после удалить знаки пунктуации в конце?
0
alsav22
5444 / 4839 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 19:28 4
Цитата Сообщение от Tulosba Посмотреть сообщение
Он не предназначен для наследования.
Почему?
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 19:38 5
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему?
Как минимум по причине отсутствия виртуального деструктора.
1
12.06.2014, 19:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2014, 19:38

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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