Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
MuslimPalit
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
1

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

25.02.2016, 00:57. Просмотров 716. Ответов 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
Ответы с готовыми решениями:

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

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string...

Упорядочить по алфавиту буквы каждого слова и удалить слова, содержащие одинаковые буквы
Преобразовать данное предложение, упорядочив по алфавиту буквы каждого слова и...

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

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

34
avgoor
1042 / 610 / 157
Регистрация: 05.12.2015
Сообщений: 1,735
25.02.2016, 18:34 21
Лучший ответ Сообщение было отмечено MuslimPalit как решение

Решение

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 / 9
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 18:53  [ТС] 22
avgoor, stringstream? Что это и что подключать
0
avgoor
1042 / 610 / 157
Регистрация: 05.12.2015
Сообщений: 1,735
25.02.2016, 18:57 23
MuslimPalit, #include<sstream>. Стандартный поток.
1
MuslimPalit
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 19:06  [ТС] 24
avgoor, мда намудрил так намудрил, я протестирую и попробую в свой код закинуть в функции, только если у меня строки даны уже - сложности не возникнут наверно.

Добавлено через 6 минут
avgoor, спасибо все идеально работает, надо будет кругозор расширить, а то в один string да vector уперся
0
avgoor
1042 / 610 / 157
Регистрация: 05.12.2015
Сообщений: 1,735
25.02.2016, 19:14 25
MuslimPalit, Только учти - решение не идеальное (на коленке за 3 минуты).
0
MuslimPalit
30 / 6 / 9
Регистрация: 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
1042 / 610 / 157
Регистрация: 05.12.2015
Сообщений: 1,735
25.02.2016, 19:26 27
Лучший ответ Сообщение было отмечено MuslimPalit как решение

Решение

Цитата Сообщение от MuslimPalit Посмотреть сообщение
просто в тумане из-за инициализации и функция getline не пойму для чего
getline - прочитать строку (по умолчанию до '\n', но в третьем параметре мы указали, что до ',')

map используется так. если в нем значение false - символ переходит в результат и в map заносится true, если true - то пропускается.
При инициализации - если символ входит в выражение то сразу заносим true. Если символ встречается в одиночном виде проверяем встречался ли он ранее и если нет то заносим false. Т.о. в результат попадет только первый одиночный, если он не встречается в выражениях.
1
MuslimPalit
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 20:00  [ТС] 28
все шикарно получается
0
Миниатюры
Удалить одинаковые буквы из контейнера std::string  
MuslimPalit
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 20:07  [ТС] 29
avgoor,
Цитата Сообщение от avgoor Посмотреть сообщение
C++
1
ss.str(str);
а она для чего
0
avgoor
1042 / 610 / 157
Регистрация: 05.12.2015
Сообщений: 1,735
25.02.2016, 20:12 30
MuslimPalit, Инициализация содержимого потока.
1
MuslimPalit
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 20:25  [ТС] 31
avgoor, нужно порешать пару задач данного типа, а то не пойму как все происходит

Добавлено через 2 минуты
avgoor, вот функция resize() вроде бы изменяет размер контейнера, а что она здесь выполняет
0
avgoor
1042 / 610 / 157
Регистрация: 05.12.2015
Сообщений: 1,735
25.02.2016, 20:34 32
MuslimPalit, Убирает лишнюю запятую в конце.
1
MuslimPalit
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 20:40  [ТС] 33
avgoor, почему именно std::stringstream
0
avgoor
1042 / 610 / 157
Регистрация: 05.12.2015
Сообщений: 1,735
25.02.2016, 20:48 34
MuslimPalit, а что вы предлагаете вместо stringstream?
0
MuslimPalit
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
25.02.2016, 23:27  [ТС] 35
avgoor, просто я вижу его впервые, ну там вектор

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

Добавлено через 2 часа 1 минуту
Проверить имеются ли одинаковые несвязанные буквы в прямом(А - без отрицания) или инверсном(а - отрицание) виде в первой и во второй строке. Если имеются, принять решение "Строка доказана", иначе перенести одну букву с первой строки во вторую или со второй строки в первую. Данный шаг является продолжением предыдущего
0
25.02.2016, 23:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2016, 23:27

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

Операция std::cout для Объекта типа std::string
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор...

No match for 'operator<' (operand types are 'std::__cxx11::string {aka std::__c
Имеем следующий код: #include &lt;iostream&gt; #include &lt;string&gt; #include...


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

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

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