0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 20
1

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

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

добрый вечер, была такая задача -удалить из строки одинаковые -подряд идущие слова. подскажите, это нужно каждую букву сравнивать ? и как написать что бы удалялись именно подряд идущие слова? программа на с++
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2012, 20:31
Ответы с готовыми решениями:

Удаление одинаковых слов в строке
#include "stdafx.h" #include "iostream" #include "conio.h" using namespace std; int...

Удаление одинаковых слов в строке
Здравствуйте, задача заключается в удалении одинаковых слов в строке. Пытался решить, но не доходит...

Проход по массиву и удаление одинаковых слов
Доброе утро!Программа выполняет чтение вводимых слов с консоли и записывает каждое слово в массив...

Поиск слов по маске в строке, их удаление, сортировка оставшихся слов
Доброго времени суток. Помогите, пожалуйста, реализовать задачу. нужно из текстового файла считать...

31
1454 / 791 / 257
Регистрация: 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;
}
1
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 20
07.09.2012, 00:53  [ТС] 3
вполне, спасибо вам
0
5480 / 4875 / 831
Регистрация: 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;
}
1
599 / 567 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
07.09.2012, 16:42 5
Цитата Сообщение от alsav22 Посмотреть сообщение
удаляем дубликаты из списка
может проще тогда использовать set???
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2012, 16:56 6
Цитата Сообщение от panicwassano Посмотреть сообщение
может проще тогда использовать set???
В чём проще? Нужно удалить не все одинаковые слова, а только подряд идущие одинаковые. Код предложите с set.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
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;
}
3
5480 / 4875 / 831
Регистрация: 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;
            }
        }
0
6242 / 3543 / 898
Регистрация: 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;
}
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
07.09.2012, 21:26 10
Цитата Сообщение от alsav22 Посмотреть сообщение
Но если обработанную строку нужно будет сохранить?
Да не вопрос! std::ostringstream
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2012, 21:39 11
Цитата Сообщение от easybudda Посмотреть сообщение
Да не вопрос! std::ostringstream
Вопрос не в том как. Если будет сохранение, то ваш код будет не проще моего, а может и сложнее. Согласны?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
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;
}
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.09.2012, 00:53 13
Цитата Сообщение от easybudda Посмотреть сообщение
Если будет сохранение
И где оно в вашем коде? Опять просто вывод на консоль.
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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/... c6ee62f501
2
║XLR8║
1210 / 907 / 270
Регистрация: 25.07.2009
Сообщений: 4,354
Записей в блоге: 5
08.09.2012, 01:03 15
За баги скоро вешать начнут.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
08.09.2012, 01:11 16
Цитата Сообщение от alsav22 Посмотреть сообщение
И где оно в вашем коде?
В каком смысле? ost.str() возвращает строку не содержащую повторяющиеся слова. Хотите - сохраняйте её куда-нибудь, хотите - на консоль выводите... Все слова включая повторяющиеся нигде не хранятся? А оно надо?
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.09.2012, 01:18 17
easybudda, Откровенно говоря, не самое лучшее изобретать заново велосипед, функциональность которого повторяет алгоритм стандартной библиотеки, это я про неиспользование std::unique/list::unique.
1
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;
            }
        }
Разговор зашёл о том, чей код проще.

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
08.09.2012, 01:26 19
Цитата Сообщение от ForEveR Посмотреть сообщение
easybudda, Откровенно говоря, не самое лучшее изобретать заново велосипед, функциональность которого повторяет алгоритм стандартной библиотеки, это я про неиспользование std::unique/list::unique.
А по-моему так проще. Можно конечно доходить до фанатизма и вообще не использовать циклы, но стоит оно того? К тому же на велосипед оно и не тянет - самокат в лучшем случае...
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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 и записать в контейнер. Только для чего? В данной задаче этого не требовалось.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2012, 01:34

Удаление одинаковых слов в векторе типа string
Ай даже не буду ходить вокруг да около, просто скажу, что реализую задание (лично для себя...

Найти количество одинаковых слов в строке
#include &lt;iostream&gt; using namespace std; int main() { char str1 = &quot;to be or not to be&quot;; ...

Cтроки, vector. Посчитать количество одинаковых слов в строке
Дана строка текста разделена пробелами, символами &quot;,&quot; и &quot;;&quot;.Посчитать количество одинаковых слов в...

Удаление и замена слов в строке
Здравствуйте! Помогите, пожалуйста написать программу! Дана последовательность строк. Каждая...


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

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

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