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

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

Войти
Регистрация
Восстановить пароль
 
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
#1

Fn(string s) - в массив функций - C++

04.05.2017, 15:28. Просмотров 238. Ответов 14

Есть различные функции хэширования string
f1(string s)
f2(string s)
...
fn(string s)

как их все вызвать, не нагромождая код?

что бы было так:
Код
for(unsigned short i(0); ++i <= N;)
cout << fi(s) << endl;
Может есть что то вроде указателей на функцию
(только сейчас пришло в голову)
или как то эти адреса занести в массив функций,
что бы можно было делать инкремент ++i
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2017, 15:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Fn(string s) - в массив функций (C++):

Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()? - C++
Понятное дело, что всё обсуждение будет вертеться вокруг аналога NULL. char* f_0 () { return NULL; } char** f_1 () { ...

Использование библиотечных функций string.h - C++
Задание 3. Использование библиотечных функций string.h 1. Даны текстовая строка и слово (например, ba). Напечатать все слова, входящие в...

С помощью функций библиотеки string.h удалить из предложения слово USSR - C++
Помогите пожалуйста!!! Задание таково: удалить из предложения слово USSR. С помощью старых функций библиотеки string.h)

Найти количество слов в строке с использованием библиотечных функций string.h - C++
Найти количество слов в строке с использованием библиотечных функций string.h на языке С. Помогите Не дублируйте темы!

Как сделать замену слова в строке без использования функций библиотеки string? - C++
вводится строка =&gt; вводится слово, которое нужно заменить(если оно есть в строке)=&gt; вводится слово на которое нужно заменить

есть массив char. есть строка string. как присвоить значению string-a значение char-a? - C++
есть массив char. есть строка string. как присвоить значению string-a значение char-a?

14
Max Dark
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
04.05.2017, 15:39 #2
Цитата Сообщение от eXPonent Посмотреть сообщение
Может есть что то вроде указателей на функцию
есть. синтаксис правда внушает ужас поначалу...
C++
1
return_type (*ptr_var_name)(arg_type0, arg_type0) = somefunc;
так же есть std::function - более универсальная вещь, так как позволяет хранить функциональные объекты и lambda-функции
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
04.05.2017, 15:50  [ТС] #3
Цитата Сообщение от Max Dark Посмотреть сообщение
есть. синтаксис правда внушает ужас поначалу...
прошу прощения, а можете ткнуть где можно толково почитать с примерами?
(если это возможно, делая инкремент указателя, что бы ссылаться на другую функцию)
0
MrGluck
Модератор
Эксперт CЭксперт С++
7801 / 4845 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
04.05.2017, 16:14 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
eXPonent, можно все функции сложить в вектор из std::function. Если у них сигнатура одинаковая. И проходясь по вектору, вызывать объекты (функции).

Добавлено через 2 минуты
Опять же - хз как это будет работать на вашей древней 2010 студии. Мб она и std::function не поддерживает
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
#include <functional>
#include <iostream>
#include <string>
#include <vector>
 
size_t f1(const std::string &s)
{
    return s.length();
}
 
size_t f2(const std::string &s)
{
    return s.length() * 2;
}
 
size_t f3(const std::string &s)
{
    return s.length() * 3;
}
 
int main()
{
    std::vector<std::function<size_t(const std::string &)>> fns = {f1, f2, f3};
    for (const auto &fn : fns)
        std::cout << fn("ololo") << " ";
}
Добавлено через 2 минуты
Вариант для С++98
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
#include <iostream>
#include <string>
#include <vector>
 
size_t f1(const std::string &s)
{
    return s.length();
}
 
size_t f2(const std::string &s)
{
    return s.length() * 2;
}
 
size_t f3(const std::string &s)
{
    return s.length() * 3;
}
 
int main()
{
    std::vector<size_t(*)(const std::string &)> fns;
    fns.push_back(f1);
    fns.push_back(f2);
    fns.push_back(f3);
    for (std::vector<size_t(*)(const std::string &)>::const_iterator cit = fns.begin(); cit != fns.end(); ++cit)
        std::cout << (*cit)("ololo") << " ";
}
1
Max Dark
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
04.05.2017, 16:26 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от eXPonent Посмотреть сообщение
где можно толково почитать с примерами?
https://en.wikipedia.org/wiki/Function_pointer
http://en.cppreference.com/w/cpp/language/pointer
http://www.cplusplus.com/doc/tutorial/pointers/

Цитата Сообщение от eXPonent Посмотреть сообщение
делая инкремент указателя
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
36
37
38
39
40
41
42
43
44
45
46
47
// ideone.com/wR1H3P
#include <string>
// объявим тип "указатель на функцию",
// которая возвращает строку и принимает строку как параметр
using callback_ptr = std::string(*)(const std::string&);
/*
// можно использовать typedef
typedef std::string(*callback_ptr)(const std::string&);
*/
 
// первая функция
std::string f1(const std::string& str)
{
    return "[" + str + "]";
}
// 2я функция
std::string f2(const std::string& str)
{
    return "(" + str + ")";
}
 
// добавим массив указателей на функции
callback_ptr func_list[] = {
    f1, f2
};
 
// функция, которая принимает массив функций и их количество
std::string meta_func(callback_ptr* fptr, size_t count)
// без typedef/using код становится нечитаемым
{
    std::string result;
    callback_ptr* last = fptr + count;
    for(; fptr != last; ++fptr)
    {
        result += (*fptr)(result);
    }
    return result; 
}
 
// ну и собственно вызываем
#include <iostream>
 
int main()
{
    std::cout << meta_func(func_list, 2) << std::endl;
    return 0;
}
1
Kudryashov_R_D
20 / 20 / 3
Регистрация: 11.09.2015
Сообщений: 101
04.05.2017, 16:27 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
eXPonent, "Язык программирования C++. Базовый курс. Пятое издание" С.Б. Липман. Раздел 14.8.3. Вызываемые объекты и тип function
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
09.05.2017, 19:13  [ТС] #7
Пишу так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned int Ly(string s)
{
    unsigned int Ly = 0;
    for (string::iterator i(s.begin()); i != s.end(); ++i)
        Ly = Ly * 1664525 + (unsigned char)(*i) + 1013904223;
    return Ly;
}
 
unsigned int Rs(string s)
{
    unsigned int Rs = 0;
    unsigned int magic = 63689;
    for (string::iterator i(s.begin()); i != s.end(); ++i)
        Rs = Rs * magic + (unsigned char)(*i), magic *= 378551;
    return Rs;
}
 
char N(2); // Кол-во функций
unsigned int(*)(const string &) F[N]={Ly, Rs};
Ответ:
Кликните здесь для просмотра всего текста
Ошибка 1 error C2059: синтаксическая ошибка: ) c:\users\1\desktop\hash\hash\hash.cpp 45 1 hash
Ошибка 2 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" c:\users\1\desktop\hash\hash\hash.cpp 45 1 hash
Ошибка 3 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) c:\users\1\desktop\hash\hash\hash.cpp 45 1 hash
4 IntelliSense: требуется идентификатор c:\users\1\desktop\hash\hash\hash.cpp 45 15 hash
5 IntelliSense: требуется точка с запятой ";" c:\users\1\desktop\hash\hash\hash.cpp 45 33 hash


Что я сделал не так?
0
Max Dark
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
09.05.2017, 19:47 #8
Цитата Сообщение от eXPonent Посмотреть сообщение
Что я сделал не так?
массив функций без typedef объявляется по другому
C++
1
unsigned int(*F[])(string)={Ly, Rs};
с typedef/using будет привычнее
C++
1
2
3
typedef unsigned int(*FuncPtr)(string);
// using FuncPtr = unsigned int(*)(string);
FuncPtr F[]={Ly, Rs};
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
09.05.2017, 20:22  [ТС] #9
C++
1
unsigned int(*F[])(string)={Ly, Rs};
используя эту строчку как узнать кол-во функций?

или лучше так писать:
C++
1
2
char N(2); // Кол-во функций
unsigned int(*F[N])(string)={Ly, Rs};
И почему (string), если раньше вы писали:
(const string &) они чем то отличаются?

и ещё вопрос в функциях хэширования создается дополнительный string или передается указатель на string ?
0
Max Dark
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
09.05.2017, 20:47 #10
Цитата Сообщение от eXPonent Посмотреть сообщение
И почему (string)
потому что ваши функции принимают копию string по значению
Цитата Сообщение от eXPonent Посмотреть сообщение
если раньше вы писали:
(const string &) они чем то отличаются?
в старом варианте - передача неизменяемого(const) объекта по ссылке, но он не подойдет изза сигнатуры ваших функций.
Цитата Сообщение от eXPonent Посмотреть сообщение
дополнительный string или передается указатель на string ?
в вашем случае создается копия.
Цитата Сообщение от eXPonent Посмотреть сообщение
используя эту строчку как узнать кол-во функций?
как для всех массивов постоянной размерности
C++
1
size_t cnt = sizeof(F)/sizeof(F[0]);
Цитата Сообщение от eXPonent Посмотреть сообщение
или лучше так писать:
в таком случае N нужно определить как const
C++
1
const size_t N = 2;
1
GbaLog-
Любитель чаепитий
3122 / 1462 / 351
Регистрация: 24.08.2014
Сообщений: 5,175
Записей в блоге: 1
Завершенные тесты: 2
10.05.2017, 05:58 #11
Цитата Сообщение от eXPonent Посмотреть сообщение
используя эту строчку как узнать кол-во функций?
c++11
C++
1
2
3
4
5
template<typename T, size_t N>
constexpr size_t arrSize(const T (&)[N]) noexcept
{
    return N;
}
c++98/03
C++
1
2
3
4
5
template<typename T, size_t N>
char (&arrSizeHelper(const T (&)[N]))[N];
 
#define dARRAY_SIZE(x) \
    (sizeof(arrSizeHelper((x))))
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
18.05.2017, 11:49  [ТС] #12
Доброе утро, пользуясь своей же темой, хочу спросить

C++
1
2
3
4
5
6
7
8
inline unsigned long s4_char4(unsigned char S[4])
{
    return S[0] + (S[1] << 8) + (S[2] << 16) + (S[3] << 24);    
}
inline unsigned long Ly_char4(unsigned char S[4]) { ... }
inline unsigned long Rs_char4(unsigned char S[4]) { ... }
 
unsigned long(*F_char4[])(unsigned char S[4])={s4, Ly_char4, Rs_char4};
у меня скомпилировать, но мне почему то кажется, что нужно написать:
C++
1
inline unsigned long(*F_char4[])(unsigned char S[4])={s4, Ly_char4, Rs_char4};
В инете инфы об массиве inline-функций не нашел
0
MrGluck
Модератор
Эксперт CЭксперт С++
7801 / 4845 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
18.05.2017, 12:09 #13
Цитата Сообщение от eXPonent Посмотреть сообщение
но мне почему то кажется, что нужно написать:
inline устарел.
Компилятор сам решит когда ему лучше делать встраивание, а когда нет.
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
18.05.2017, 12:32  [ТС] #14
Цитата Сообщение от MrGluck Посмотреть сообщение
inline устарел.
начиная с какой версии устарел?

для чего он сейчас нужен?
(в вузах до сих пор о них упоминают, для ускорения приложения)
0
MrGluck
Модератор
Эксперт CЭксперт С++
7801 / 4845 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
18.05.2017, 12:44 #15
Цитата Сообщение от eXPonent Посмотреть сообщение
начиная с какой версии устарел?
Я не смогу сказать с какой версии конкретных компиляторов inline как спецификатор для встраивания функций устарел, но это уже давно (в вашей 2010 студии точно уже не имеет смысла).
Цитата Сообщение от eXPonent Посмотреть сообщение
в вузах до сих пор о них упоминают, для ускорения приложения
Это проблема того, что некоторые преподаватели учились программированию в лохматые годы и за новыми тенденциями не следят, а с тех пор много что поменялось. Много где ещё по старому борланду учат, но это не значит что он востребован.
0
18.05.2017, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2017, 12:44
Привет! Вот еще темы с ответами:

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...

Найти причины и способы исправления ошибок в коде (пользовательский класс "String", перегрузка функций) - C++
Не пойму почему этот код не работает...Подскажите что не так,пожалуйста. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt;...

string массив - C++
Как создать массив в который буду я вводить данные ? Написал не большой код : // Lab_1.cpp : Defines the entry point for the...

массив string - C++
void func(string *mas) { //здесь } int main() { string s = { &quot;one&quot;,


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

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

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