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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 5.00
Serraya
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 20
#1

Удаление одинаковых слов в строке - C++

06.09.2012, 20:31. Просмотров 3226. Ответов 31
Метки нет (Все метки)

добрый вечер, была такая задача -удалить из строки одинаковые -подряд идущие слова. подскажите, это нужно каждую букву сравнивать ? и как написать что бы удалялись именно подряд идущие слова? программа на с++
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 20:31     Удаление одинаковых слов в строке
Посмотрите здесь:

Удаление и замена слов в строке C++
C++ Посчитать сколько слов в строке начинается с буквы "т" 2. Ввести фразу. Все последовательности одинаковых символов заменить на выражение N(C)
C++ Проход по массиву и удаление одинаковых слов
Удаление одинаковых слов в строке C++
Cтрока: Определить количество средних слов в строке и какое из слов начинается на большую по коду букву C++
Количество слов в заданной строке (для каждого из слов) C++
Найти количество одинаковых слов в строке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.09.2012, 00:21     Удаление одинаковых слов в строке #2
Такой вариант устроит?:
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
#include<iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
 
int main()
{
    string input = "String String objects objects are a special special type of container,"
        "specifically designed to operate with with sequences of characters characters characters objects";
    string temp, output;
    vector<string> vec;
    stringstream ss;
    ss<<input;
    while (ss>>temp)
        vec.push_back(temp);
    int i = 0;
    for (; i<vec.size() - 1; i++)
    {
        if (vec[i] != vec[i+1])
            output += vec[i] + " ";
    }
    output += vec[i];
    cout<<"INPUT:  "<<input<<endl;
    cout<<"\n============================\n\n";
    cout<<"OUTPUT:  "<<output<<endl<<endl;;
    system("pause");
    return 0;
}
Serraya
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 20
07.09.2012, 00:53  [ТС]     Удаление одинаковых слов в строке #3
вполне, спасибо вам
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2012, 04:55     Удаление одинаковых слов в строке #4
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
#include<iostream>
#include <list>
#include <string>
#include <sstream>
using namespace std;
 
int main()
{
string input = "String String objects objects are a special special" 
               "type of container, specifically designed to operate with"
               " with sequences of characters characters characters objects";
    
string temp; // для слова из строки 
list <string> lst; // список слов из строки 
stringstream ss; // поток для строк
 
ss << input; // помещаем строку в поток
    
while (ss >> temp) // извлекаем строку по слову из потока
   lst.push_back(temp); // помещаем слова в список
 
lst.unique(); // удаляем дубликаты из списка
    
for (auto i = lst.begin(); i != lst.end(); i++) // выводим слова из списка
     cout << *i << ' ';
          
cout << endl;
    
system("pause");
return 0;
}
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
07.09.2012, 16:42     Удаление одинаковых слов в строке #5
Цитата Сообщение от alsav22 Посмотреть сообщение
удаляем дубликаты из списка
может проще тогда использовать set???
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2012, 16:56     Удаление одинаковых слов в строке #6
Цитата Сообщение от panicwassano Посмотреть сообщение
может проще тогда использовать set???
В чём проще? Нужно удалить не все одинаковые слова, а только подряд идущие одинаковые. Код предложите с set.
easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
07.09.2012, 17:18     Удаление одинаковых слов в строке #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как всё сложно
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
#include <iostream>
#include <string>
#include <sstream>
 
int main() {
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ) {
        std::cout << "Result: ";
        std::istringstream ist(str);
        std::string prev = "";
        
        while ( ist >> str ) {
            if ( str != prev ) {
                std::cout << str << ' ';
                prev = str;
            }
        }
        
        std::cout << std::endl;
    }
    
    return 0;
}
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2012, 18:39     Удаление одинаковых слов в строке #8
Проще, согласен. Но если обработанную строку нужно будет сохранить? Тогда отличие будет в этом. У вас :
C++
1
2
3
4
5
6
 while ( ist >> str ) {
            if ( str != prev ) {
                std::cout << str << ' ';
                prev = str;
            }
        }
У меня:
C++
1
lst.unique();
Добавлено через 1 минуту
Может даже unique() так(или наподобие) и работает?
C++
1
2
3
4
5
6
while ( ist >> str ) {
            if ( str != prev ) {
                std::cout << str << ' ';
                prev = str;
            }
        }
Петррр
5940 / 3377 / 335
Регистрация: 28.10.2010
Сообщений: 5,926
07.09.2012, 19:00     Удаление одинаковых слов в строке #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <iterator>
 
int main()
{
    std::string str = "string string object object";
    std::istringstream stream(str);
    std::vector<std::string> vec;
    std::unique_copy((std::istream_iterator<std::string>(stream)),
        (std::istream_iterator<std::string>()), std::back_inserter(vec));
    std::ostringstream oStream;
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(oStream, " "));
    std::string result = oStream.str();
    std::cout << result << std::endl;
}
easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
07.09.2012, 21:26     Удаление одинаковых слов в строке #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Но если обработанную строку нужно будет сохранить?
Да не вопрос! std::ostringstream
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2012, 21:39     Удаление одинаковых слов в строке #11
Цитата Сообщение от easybudda Посмотреть сообщение
Да не вопрос! std::ostringstream
Вопрос не в том как. Если будет сохранение, то ваш код будет не проще моего, а может и сложнее. Согласны?
easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
08.09.2012, 00:39     Удаление одинаковых слов в строке #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Если будет сохранение, то ваш код будет не проще моего, а может и сложнее. Согласны?
Нет.
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
#include <iostream>
#include <string>
#include <sstream>
 
int main() {
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ) {
        std::istringstream ist(str);
        std::string prev = "";
        std::ostringstream ost;
        
        while ( ist >> str ) {
            if ( str != prev ) {
                ost << str << ' ';
                prev = str;
            }
        }
        
        std::cout << "Result: " << ost.str() << std::endl;
    }
    
    return 0;
}
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.09.2012, 00:53     Удаление одинаковых слов в строке #13
Цитата Сообщение от easybudda Посмотреть сообщение
Если будет сохранение
И где оно в вашем коде? Опять просто вывод на консоль.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
08.09.2012, 01:01     Удаление одинаковых слов в строке #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/algorithm/string.hpp>
#include <vector>
 
int main()
{
   std::string s = "hello and and what hello hello you doing doing";
   std::vector<std::string> v;
   boost::split(v, s, isspace, boost::token_compress_on);
   boost::copy((v | boost::adaptors::uniqued), std::ostream_iterator<std::string>(std::cout));
}
http://liveworkspace.org/code/472f05...0e44c6ee62f501
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
08.09.2012, 01:03     Удаление одинаковых слов в строке #15
За баги скоро вешать начнут.
easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
08.09.2012, 01:11     Удаление одинаковых слов в строке #16
Цитата Сообщение от alsav22 Посмотреть сообщение
И где оно в вашем коде?
В каком смысле? ost.str() возвращает строку не содержащую повторяющиеся слова. Хотите - сохраняйте её куда-нибудь, хотите - на консоль выводите... Все слова включая повторяющиеся нигде не хранятся? А оно надо?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
08.09.2012, 01:18     Удаление одинаковых слов в строке #17
easybudda, Откровенно говоря, не самое лучшее изобретать заново велосипед, функциональность которого повторяет алгоритм стандартной библиотеки, это я про неиспользование std::unique/list::unique.
alsav22
08.09.2012, 01:24
  #18

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
В каком смысле?
В том смысле, что в вашем коде нет сохранения строки без дубликатов, а в моём есть. Отсюда мой код выглядит сложнее. Если в ваше коде сделать не просто вывод, а сохранение обработанной строки в каком-либо контейнере, то код будет нисколько не проще моего. Я использую unique(), а у вас своя реализация того же:
C++
1
2
3
4
5
6
while ( ist >> str ) {
            if ( str != prev ) {
                ost << str << ' ';
                prev = str;
            }
        }
Разговор зашёл о том, чей код проще.

easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
08.09.2012, 01:26     Удаление одинаковых слов в строке #19
Цитата Сообщение от ForEveR Посмотреть сообщение
easybudda, Откровенно говоря, не самое лучшее изобретать заново велосипед, функциональность которого повторяет алгоритм стандартной библиотеки, это я про неиспользование std::unique/list::unique.
А по-моему так проще. Можно конечно доходить до фанатизма и вообще не использовать циклы, но стоит оно того? К тому же на велосипед оно и не тянет - самокат в лучшем случае...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 01:34     Удаление одинаковых слов в строке
Еще ссылки по теме:

Задача о строке. Удаление дубликатов слов C++
Удаление одинаковых слов в строке C++
C++ Cтроки, vector. Посчитать количество одинаковых слов в строке
C++ Вывод одинаковых слов
C++ Строки. Поиск одинаковых слов в предложениях. Вывод вместо одинаковых слов "*"

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
08.09.2012, 01:34     Удаление одинаковых слов в строке #20
easybudda, Смотря для кого проще. Для студента которому надо сдать лабу? Несомненно. Для программиста, который пишет код для коммерческого приложения? Нет. Стандартные средства в большинстве случаев лучше собственных реализаций тех же идей.

Добавлено через 5 минут
alsav22, Да вообще как бэ без проблем сохранить в коде easybudda.
Например:
C++
1
2
3
4
5
6
7
std::vector<std::string> list;
while ( ist >> str ) {
            if ( str != prev ) {
                list.push_back(str);
                prev = str;
            }
        }
Так же определенно можно использовать std::ostringstream, затем взять из него строку, записать в std::istringstream и записать в контейнер. Только для чего? В данной задаче этого не требовалось.
Yandex
Объявления
08.09.2012, 01:34     Удаление одинаковых слов в строке
Ответ Создать тему
Опции темы

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