Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2017, 20:02   #1
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию Функция для удаления всех знаков препинания

Есть набор строк, написать функцию, которая принимает на вход этот набор строк и возвращает новый набор строк, где в каждом из строк удалено все знаки препинания: ",.!:" Используя: std::remove_if, std::erase, std::transform
То что у меня уже есть но не работает и нужна ваша помощь:
Код:
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

bool shouldBeRemoved(char words)
{
	std::vector<char> vector;
	for (int index = 0; index < vector.size(); ++index)
		vector.emplace_back(words);
	std::transform(vector.begin(), vector.end(), vector.begin(), [](auto &s)
	{
		if (std::any_of(std::begin(s), std::end(s), std::ispunct))
			s.erase(remove_if(std::begin(s), std::end(s), std::ispunct), std::end(s));
		return s;
	});
}

int main()
{
	char words[] = { "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." };
	shouldBeRemoved(*words);
	for (const auto& i : words) 
	{
		std::cout << i << "\n";
	}
	return 0;
}
dimaSlon вне форума Ответить с цитированием
Старый 24.06.2017, 20:39   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Код:
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>

using str_list = std::vector<std::string>;

str_list shouldBeRemoved(const str_list& words)
{	
	const static std::set<char> toRemove = {',', '.', '!', ':'};
    
    str_list result;
    result.resize(words.size());
    
    std::transform(words.begin(), words.end(), result.begin(), [](auto &s)
	{
		auto tmp = s;
        auto it = std::remove_if(tmp.begin(), tmp.end(),  [](char symb){
            return toRemove.count(symb) > 0;
        });
        tmp.erase(it, tmp.end());
        return tmp;
	});
    return result;
}

int main()
{
	const str_list words = {
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "More. String.!",
    };
    
	auto r = shouldBeRemoved(words);
	for (const std::string& i : r) 
	{
		std::cout << i << "\n";
	}
	return 0;
}
alexzk вне форума Ответить с цитированием
Старый 24.06.2017, 21:50   #3
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Код:
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>

using str_list = std::vector<std::string>;

str_list shouldBeRemoved(const str_list& words)
{	
	const static std::set<char> toRemove = {',', '.', '!', ':'};
    
    str_list result;
    result.resize(words.size());
    
    std::transform(words.begin(), words.end(), result.begin(), [](auto &s)
	{
		auto tmp = s;
        auto it = std::remove_if(tmp.begin(), tmp.end(),  [](char symb){
            return toRemove.count(symb) > 0;
        });
        tmp.erase(it, tmp.end());
        return tmp;
	});
    return result;
}

int main()
{
	const str_list words = {
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "More. String.!",
    };
    
	auto r = shouldBeRemoved(words);
	for (const std::string& i : r) 
	{
		std::cout << i << "\n";
	}
	return 0;
}
Severity Code Description Project File Line Suppression State
Error C1001 An internal error has occurred in the compiler. StringPunctuation

Последний раз редактировалось dimaSlon; 24.06.2017 в 21:53.
dimaSlon вне форума Ответить с цитированием
Старый 24.06.2017, 21:55   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
An internal compiler error, an ICE, is always a bug.

Please report it via Microsoft Connect.
думаю. криво скопировалось из броузера.
alexzk вне форума Ответить с цитированием
Старый 24.06.2017, 22:00   #5
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
думаю. криво скопировалось из броузера.
Код:
return toRemove.count(symb) > 0;
на это кричит
dimaSlon вне форума Ответить с цитированием
Старый 25.06.2017, 09:20   #6
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
думаю. криво скопировалось из броузера.
http://rextester.com/SPYOU10543 тоже тут таже ошибка
dimaSlon вне форума Ответить с цитированием
Старый 25.06.2017, 11:24   #7
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
думаю. криво скопировалось из броузера.
я уже и в онлайн проверял, все таже ошибка. А мой код можно както поправить? а то я не хочу просто взять чужой код, а хочу разобратся и свой переделать.
dimaSlon вне форума Ответить с цитированием
Старый 25.06.2017, 11:35   #8
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

какой тип должен быть в функции remove вместо auto, и правильно ли я делаю что передаю bool?
Код:
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
bool remove(auto& сh)
{
	if (std::any_of(сh.begin(), сh.end(), ispunct))
		сh.erase(std::remove_if(сh.begin(), сh.end(), ispunct), сh.end());
	return сh;
}

bool shouldBeRemoved(char words)
{
	std::vector<char> vector;
	for (int index = 0; index < vector.size(); ++index)
		vector.emplace_back(words);
	std::transform(vector.begin(), vector.end(), vector.begin(), remove);
}

int main()
{
	char words[] = { "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." };
	shouldBeRemoved(*words);
	for (const auto& i : words)
	{
		std::cout << i << "\n";
	}
	return 0;
}
dimaSlon вне форума Ответить с цитированием
Старый 25.06.2017, 11:37   #9
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

и правильно я делаю:
Код:
std::transform(vector.begin(), vector.end(), vector.begin(), remove);
dimaSlon вне форума Ответить с цитированием
Старый 25.06.2017, 12:02   #10
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

я хз, что вы там проверяли, у меня нет визуалки, g++ по умолчанию все норм компилит.
...трансформ применяет заданную функцию (ЛЮБУЮ!) к интервалу и результат применения сохраняет в другом интервале начиная с (т.о. интервал-результат уже должен иметь нужный размер).
ремове_иф - использует предикат (булева функция), если он возвращает труе, то значение перемещается в конец, т.о. после выполения ремове_иф мы имеем итератор на первое перемещенное значение (они не удалены, они в конце).
ерейз - стирает заданные интервал (задаем началом результат ремове_иф, и концом - конец вектора).

...вообще полезно почитать оригинал документации, а не требовать перевода тут ...вы справитесь, в свое время, после школы, я знал 5 слов на английском. Потом 2-3 года упорного чтения документации на англ с компакт диска. по компу с бумажным словарем (а переводных и интернета еще не было), теперь свободно говорю.

Последний раз редактировалось alexzk; 25.06.2017 в 12:07.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать количество знаков препинания С++ wolchara Помощь студентам 2 11.01.2015 14:36
Функция для удаления елементов которые меньше среднего арифметического всех елементов масива.С++. DIQUON Помощь студентам 4 18.12.2012 20:33
Удаление знаков препинания из текстов. С++ Angriff Помощь студентам 3 08.03.2012 15:52
последовательность знаков препинания Владимир_король Помощь студентам 3 29.04.2010 10:56
Программа удаления знаков препинания... hen Общие вопросы C/C++ 17 11.10.2009 16:57