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

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

Войти
Регистрация
Восстановить пароль
 
 
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
#1

Удалить одинаковые буквы из контейнера std::string - C++

25.02.2016, 00:57. Просмотров 650. Ответов 34
Метки нет (Все метки)

Необходимо найти в первой строке так же во второй строке одинаковые буквы и удалить все кроме одной похожей. При это удаляется впереди стоящая запятая если она есть, или сзади стоящая. Пример:
-даны буквы A B C D
-даны операции , v ^
Например: A^B,C,A,DvB и B,A,AvD
После удаления всех кроме одной похожей буквы остается в первой строке A^B,C,DvB
После удаления всех кроме одной похожей буквы остается во второй строке B,AvD
Проблемным в задании является то что буквы известны только после ввода в строки(буквы и операции в строке).

Добавлено через 3 часа 6 минут
коменты

Добавлено через 45 минут
я не могу удалив похожие одной буквы в строке, удалять также следующие похожие буквы

Добавлено через 21 минуту
ну как то так но это не то
C++
1
2
3
4
5
6
7
string abc = "A";
    size_t found_L, found_R;
    if ((found_L = leftPPF.find_first_of(abc) != std::string::npos) && (found_R = rightPPF.find_first_of(abc) != std::string::npos)) {
 
        replace(leftPPF.begin() + found_L + 1, leftPPF.end(), abc[0], ' ');
        replace(rightPPF.begin() + found_R + 1, rightPPF.end(), abc[0], ' ');
    }
Добавлено через 23 минуты
есть у кого идеи или что то непонятно по заданию

Добавлено через 21 минуту
через цикли тоже не получается
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
    for (unsigned int i = 0; i < leftPPF.length() - 1; ++i) {
 
        for (unsigned int k = i + 2; k < leftPPF.length(); ++k) {
            // шаг 13!
            if (leftPPF[i] == leftPPF[k]) {
 
                leftPPF[i] = ' ';
                leftPPF.erase(leftPPF[i], 1);
            }
        }
    }
    for (unsigned int j = 0; j < rightPPF.length() - 1; ++j) {
 
        for (unsigned int k = j + 2; k < rightPPF.length(); ++k) {
            // шаг 13!
            if (rightPPF[j] == rightPPF[k]) {
 
                rightPPF[j] = ' ';
                rightPPF.erase(rightPPF[j], 1);
            }
        }
    }
 
    cout << leftPPF << "=>" << rightPPF;
Добавлено через 43 минуты
надо удалить надо надо удалить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2016, 00:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить одинаковые буквы из контейнера std::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...

запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ - C++
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

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

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; void...

Передача функции указатель на элемент std::vector<std::string> - C++
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...

34
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 18:04  [ТС] #16
Цитата Сообщение от nd2 Посмотреть сообщение
A,A^B,C,D,A,DvB,B,AvC,C
Получаем такое?
A^B,D,DvB,B,AvC
говорю еще раз уходят все похожие кроме одной, A^B,DvB,AvC то что в операции обязательно

Добавлено через 2 минуты
avgoor, я программу пиши в string и все идет в строке даже пробелов в строке нет. а между строками как хочешь. Это один из 21 шагов, по моему 13-й и выведен будет один раз
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
25.02.2016, 18:06 #17
Цитата Сообщение от MuslimPalit Посмотреть сообщение
говорю еще раз уходят все похожие кроме одной, A^B,DvB,AvC то что в операции обязательно
Т.е., ответ на это:
Цитата Сообщение от nd2 Посмотреть сообщение
A,A^B,C,D,A,DvB,B,AvC,C
Получаем такое?
A^B,D,DvB,B,AvC
нет?
0
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 18:10  [ТС] #18
nd2, нет
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
25.02.2016, 18:11 #19
Тогда я ничего не понял. Кто понял - пусть помогает. От темы отписался.
0
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 18:16  [ТС] #20
nd2, даже если такое AvB,C^B,BvD,B его результат AvB,C^B,BvD в операции буквы обязательные, но и они уйдут позже, но сейчас надо сделать это преобразование. Предположительно я знаю как сделать но осуществить не получается: берем алфавит и парсим по нему все буквы в строке, если есть буква связанная операцией то мы удаляем все похожией кроме тех что находятся в операции
0
avgoor
960 / 594 / 130
Регистрация: 05.12.2015
Сообщений: 1,667
25.02.2016, 18:34 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
int main()
{
    std::string str = "A^B,C,A,DvB";
    std::stringstream ss(str);
 
    std::map<char, bool> chars;
    std::string s;
    while (!ss.eof()) {
        std::getline(ss, s, ',');
        if (s.length() == 1) {
            if (chars.find(s[0]) == chars.end())
                chars[s[0]] = false;
        }
        else /*if(s.lenght()==3*/ {
            chars[s[0]] = true;
            chars[s[2]] = true;
        }
    }
 
    ss.str(str);
    ss.clear();
    std::string result;
    while (!ss.eof()) {
        std::getline(ss, s, ',');
        if (s.length() == 1) {
            if (chars[s[0]])
                continue;
            chars[s[0]] = true;
        }
        result += s + ",";
    }
    if (result.length())
        result.resize(result.length() - 1);
    std::cout << result << std::endl;
}
За два прохода без дополнительного вектора токенов.
1
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 18:53  [ТС] #22
avgoor, stringstream? Что это и что подключать
0
avgoor
960 / 594 / 130
Регистрация: 05.12.2015
Сообщений: 1,667
25.02.2016, 18:57 #23
MuslimPalit, #include<sstream>. Стандартный поток.
1
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 19:06  [ТС] #24
avgoor, мда намудрил так намудрил, я протестирую и попробую в свой код закинуть в функции, только если у меня строки даны уже - сложности не возникнут наверно.

Добавлено через 6 минут
avgoor, спасибо все идеально работает, надо будет кругозор расширить, а то в один string да vector уперся
0
avgoor
960 / 594 / 130
Регистрация: 05.12.2015
Сообщений: 1,667
25.02.2016, 19:14 #25
MuslimPalit, Только учти - решение не идеальное (на коленке за 3 минуты).
0
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 19:18  [ТС] #26
avgoor, пока сойдет, и изучить что да как, можешь пробежаться по частям, алгоритм вроде бы понятен, но некоторые части не могу понят что из себя представляют

Добавлено через 1 минуту
avgoor,
Цитата Сообщение от avgoor Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
while (!ss.eof()) {
* * * * std::getline(ss, s, ',');
* * * * if (s.length() == 1) {
* * * * * * if (chars.find(s[0]) == chars.end())
* * * * * * * * chars[s[0]] = false;
* * * * }
* * * * else /*if(s.lenght()==3*/ {
* * * * * * chars[s[0]] = true;
* * * * * * chars[s[2]] = true;
* * * * }
* * }
просто в тумане из-за инициализации и функция getline не пойму для чего
0
avgoor
960 / 594 / 130
Регистрация: 05.12.2015
Сообщений: 1,667
25.02.2016, 19:26 #27
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от MuslimPalit Посмотреть сообщение
просто в тумане из-за инициализации и функция getline не пойму для чего
getline - прочитать строку (по умолчанию до '\n', но в третьем параметре мы указали, что до ',')

map используется так. если в нем значение false - символ переходит в результат и в map заносится true, если true - то пропускается.
При инициализации - если символ входит в выражение то сразу заносим true. Если символ встречается в одиночном виде проверяем встречался ли он ранее и если нет то заносим false. Т.о. в результат попадет только первый одиночный, если он не встречается в выражениях.
1
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 20:00  [ТС] #28
все шикарно получается
0
Миниатюры
Удалить одинаковые буквы из контейнера std::string  
MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 20:07  [ТС] #29
avgoor,
Цитата Сообщение от avgoor Посмотреть сообщение
C++
1
ss.str(str);
а она для чего
0
avgoor
960 / 594 / 130
Регистрация: 05.12.2015
Сообщений: 1,667
25.02.2016, 20:12 #30
MuslimPalit, Инициализация содержимого потока.
1
25.02.2016, 20:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2016, 20:12
Привет! Вот еще темы с ответами:

Как правильно перевести std::wstring в std::string ? - C++
Собственно как? :)

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

std::string, std::fstream, ошибка кучи - C++
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString. Замечательно, то же самое... ошибка при...

Как привести std::wstring к std::string? - C++
Как привести std::wstring к std::string?


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

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

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