Форум программистов, компьютерный форум CyberForum.ru

C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
19.06.2010, 01:49     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #1
Есть почти готовое решение,помогите пожалуйста доделать,немного не понимаю

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
48
#include <cstdlib>
#include <iostream>
template <typename T>//shablon
void maxn(T arr[],int cz);
template <> void maxn(char * cArr,int p);//spezializacia
using namespace std;
int main(int argc, char *argv[])
{
    int mass1[6] = {5,90,3,2,9,7};
    maxn(mass1,6);
    double mass2[4] = {4.8,8.0,5.3,3.14};
    maxn(mass2,4);
    cout<<"rabotaet cArr[5]!"<<endl;
    char * mchar[5] = {
                       "Dasha",
                       "Inokenty",
                       "Jora",
                       "Tanyasdw",
                       "Irina"
                      };
                             
    maxn(mchar,5);//ПРОБЛЕМА С ЭТОЙ ФУНКЦИЕЙ=)
    system("PAUSE");
    return EXIT_SUCCESS;
}
template <typename T>
void maxn(T arr[],int cz)
{ 
    double maxx = arr[0];
    for(int i = 1;i<cz;i++)
    {
        if(arr[i] > maxx)
         maxx = arr[i];
    }
    cout<<"bolshee chislo:"<<maxx<<endl;
}
template <> void maxn(char * cArr,int p)
{
   char(*db)[] = cArr[0][0];
  for(int i=0;i<p;i++)
   {
     if(cArr>db)
      db = cArr; 
    }     
    cout<<"adress stroki:"<<db<<endl;
    // for(int i = 0;i<p;++i)
    //cout<<maxx[i]<<"  adress:"<<&maxx[i]<<endl; 
}
По заданию сказано создать шаблон функции maxn() и специализацию,которая возвращает адрес самой длинной строки.Шаблон работает,а вот с нахождением строки возникает вопрос. Как найти самую длинную строку?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2010, 01:49     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char
Посмотрите здесь:

C++ Поиск слова в массиве символов char
Поиск самой длинной строки в файле C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк C++
C++ Поиск самой длиной серии одинаковых элементов в двумерном массиве
поиск в массиве char цифр C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
19.06.2010, 04:03     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #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
30
31
32
33
34
#include <iostream>
//#include <list>
 
template<typename T>
T func(T arr[], int S){
    //....
    return arr[0];
}
 
template<>
const char *func(const char *arr[], int S){
    const char *buff = arr[0];
    for(int i = 1; i < S; ++i){
        if(strlen(buff) < strlen(arr[i]))
            buff = arr[i];
    }
 
    return buff;
}
int main(){
 
    int arr[3] = {1, 2, 3};
 
    const char *sarr[3] = {
        "asd",
        "asdf",
        "asd"
    };
 
    std::cout << func(sarr, 3) << std::endl; // asdf
 
    std::cout << func( arr, 3) << std::endl; // 1 
    return 0;
}
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
19.06.2010, 12:16  [ТС]     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #3
Скажите пожалуйста,а почему нельзя использовать функция void не возвращающую указатель,а непосредственно выводящую результат внутри себя через cout?
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
19.06.2010, 12:21     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #4
Цитата Сообщение от USHЁL Посмотреть сообщение
Скажите пожалуйста,а почему нельзя использовать функция void не возвращающую указатель,а непосредственно выводящую результат внутри себя через cout?
Мне так больше нравится.. и вам это ни кто не мешает сделать.
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
19.06.2010, 12:33  [ТС]     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #5
Я сделал,но комп-р ругается(на строчке прототипирования специализации и выдаёт сообщение типа:template-id`maxn<>'for`const char* maxn(const char**,int)'does not match any template declaration) =) Использую wxDev-C++
Или не нужно определение шаблона?Што то я немного не пойму?(Сама задача:Создайте шаблон функции maxn(),которая принимает в качестве аргумента массив элементов типа T и целое число,представляющее собой кол-во элементов в массиве,а возвращает элемент с наибольшим значением.Протестируйте её работу в программе,которая использует шаблон данной функции с массивом из 6 значений типа int и массивом из 4 значений типа double.Программа также должна включать специализацию,которая использует в качестве аргумента массив указателей на char и кол-во указателей в качестве второго аргумента,а затем возвращает адрес самой длинной строки.Если имеется более одной строки наибольшей длины,функция возвращает адрес первой из них.Выполнить проверку специализации на примере массива,состоящего из 5-и указателей на строки.)

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
48
49
#include <cstdlib>
#include <iostream>
template <typename T>//shablon
void maxn(T arr[],int cz);
template <>
const char * maxn(const char * cArr[],int p);//spezializacia
using namespace std;
int main(int argc, char *argv[])
{
    int mass1[6] = {5,90,3,2,9,7};
    maxn(mass1,6);
    double mass2[4] = {4.8,8.0,5.3,3.14};
    maxn(mass2,4);
    cout<<"rabotaet cArr[5]!"<<endl;
    const char * mchar[9] = {
                       "Dasha",
                       "InokentyW",
                       "Jora",
                       "Tanyasdw",
                       "IrinaW"
                      };
                             
    cout<<maxn(mchar,5);
    system("PAUSE");
    return EXIT_SUCCESS;
}
///
template <typename T>
void maxn(T arr[],int cz)
{ 
    double maxx = arr[0];
    for(int i = 1;i<cz;i++)
    {
        if(arr[i] > maxx)
         maxx = arr[i];
    }
    cout<<"bolshee chislo:"<<maxx<<endl;
}
///
template <> const char * maxn(const char * cArr,int p)
{  
     char *buff = cArr;
        for(int i = 1; i < p; ++i)
          {
            if(strlen(buff) < strlen(cArr[i]))
            buff = cArr[i];   
          }   
    return buff;
}
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
25.06.2010, 17:27     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #6
Вот поправил..
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
#include <cstdlib>
#include <iostream>
 
///
template <typename T>
T func_max(T arr[], int count)
{ 
    T Res = arr[0];
    for(int i = 0; i < count; ++i)
        if(arr[i] > Res)
            Res = arr[i];
    return Res;
}
 
template <> 
const char *func_max(const char *cArr[], int count)
{  
    const char *Res = cArr[0];
    for(int i = 0; i < count; ++i)
        if(strlen(Res) < strlen(cArr[i]))
            Res = cArr[i];    
    return Res;
}
 
int main(int argc, char *argv[])
{
    int     mass1[6] = { 5, 90, 3, 2, 9, 7  };
    double  mass2[4] = { 4.8, 8.0, 5.3, 3.14};
    const char *mchar[5] = 
    {
        "Dasha",
        "InokentyW",
        "Jora",
        "Tanyasdw",
        "IrinaW"
    };
 
    std::cout << func_max(mass1,6) << std::endl;
    std::cout << func_max(mass2,4) << std::endl;
    std::cout << func_max(mchar,5) << std::endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
http://codepad.org/1iCA3pbb
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
25.06.2010, 19:27  [ТС]     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #7
Благодарю! Я понял,что специализация основана на шаблоне.Т.е. когда создаётся специализация то она создаётся по подобию исходного шаблона. А в шаблоне
template <typename T>
T maxn(...), под именем T подразумевается как бы любой тип данных который нам будет нужен.
Если не так поправьте меня=)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.06.2010, 19:42     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #8
Цитата Сообщение от ISergey Посмотреть сообщение
template <>
ISergey, объясните, пожалуйста, смысл этой конструкции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2010, 20:14     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char
Еще ссылки по теме:

C++ Поиск самой длинной строки в const char**
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++
array char* to char* (значения массива указателей в один указатель) C++

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

Или воспользуйтесь поиском по форуму:
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
25.06.2010, 20:14     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char #9
easybudda, Это специализация шаблона.. если стандартный шаблон не подходит под некоторую реализацию то можно сделать ее специализацию под конкретный тип данных..

По большей части применяется в мета-программировании...
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
#include <iostream>
using namespace std;
 
template<typename T> class IsFundamental{
public:
    enum { Yes = 0, No = 1 };
};
 
template<> class IsFundamental<int>{
public:
    enum { Yes = 1, No = 0 };
};
 
#define MK_FUND_TYPE(T)             \
template<> class IsFundamental<T>{  \
public:                             \
    enum { Yes = 1, No = 0 };       \
}
 
MK_FUND_TYPE(double);
MK_FUND_TYPE(float);
MK_FUND_TYPE(char);
MK_FUND_TYPE(void);
MK_FUND_TYPE(bool);
//MK_FUND_TYPE(int);
//...........
 
 
class MyType{};
 
int main()
{
 
    if(IsFundamental<int>::Yes)
        std::cout << "Ok..\n";
 
    if(IsFundamental<float>::Yes)
        std::cout << "Ok..\n";
 
    if(IsFundamental<int*>::Yes)
        std::cout << "((((..\n";
 
    if(IsFundamental<MyType>::Yes)
        std::cout << "((((..\n";
 
    return 0;
}
http://codepad.org/wqRrRhtB

Доволи не плохо все это описано в книге Шаблоны C++. Справочник разработчика
Yandex
Объявления
25.06.2010, 20:14     C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char
Ответ Создать тему
Опции темы

Текущее время: 21:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru