2016-04-18 2 views
1

Вот мое упражнение код .. книги вопрос рефакторинга этот код шаблона (с STL)Как реорганизовать этот код с помощью STL?

я нашел некоторые книги и Google, но я не понимаю

вы можете показать мне пример, пожалуйста? ?

int SumInt(const int* a, int count) { 
    int result = 0; 
    for (int i = 0; i < count; ++i) { 
    result += a[i]; 
    } 
    return result; 
} 

float SumFloat(const float* a, int count) { 
    float result = 0; 
    for (int i = 0; i < count; ++i) { 
    result += a[i]; 
    } 
    return result; 
} 
void main() { 
    int intVals[] = {0, 1, 2}; 
    float floatVals[] = {0.F, 1.F, 2.F}; 

    int intTotal = SumInt(intVals, 3); 
    float floatTotal = SumFloat(floatVals, 3); 

.... 
} 
+0

Начать с замены исходных массивов на 'std :: vector':' std :: vector intVals {0, 1, 2}; '' std :: vector floatVals = {0.F, 1.F , 2.F}; ' –

+1

http://en.cppreference.com/w/cpp/algorithm/accumulate –

+2

Если ваша книга говорит вам' void main', это не книга на C++. –

ответ

-1

Вы используете шаблоны, подобные этому. Также читайте на них: http://www.cplusplus.com/doc/oldtutorial/templates/

template<typename T> 
T doSomething(const T a, int count) 
{ 
    // do your stuff 

} 

Вы можете использовать его как это:

int w = 1; 
doSomething(w, 1); 

Вы заменяете T с int в этом случае

+0

В этом случае вам не нужно указывать ''. Компилятор может его вывести. Просто позвоните 'doSomething (1, 1)' – DeathTails

+0

Да, только что изменил thath @DeathTails спасибо – Ceros

5

Вы можете использовать std::accumulate:

int intTotal = std::accumulate(std::begin(intVals), std::end(intVals), 0); 
float floatTotal = std::accumulate(std::begin(floatVals), std::end(floatVals), 0.0F); 
2

В этом примере, вы можете заменить оба SumInt и SumFloat с шаблоном Sum следующим образом:

template <typename T> int Sum(const T* a, int count) { 
    T result = 0; 
    for (int i = 0; i < count; ++i) { 
     result += a[i]; 
    } 
    return result; 
} 

Затем в main(), вы можете позвонить

int intTotal = Sum(intVals, 3); 
float floatTotal = Sum(floatVals, 3); 

и компилятор будет вызывать либо int или float версии в зависимости от тип аргумента, который вы указываете на Sum.

+0

В основном идея заключается в замене определенного типа данных (int this case 'int' или' float') на общий. Люди часто используют «Т» в качестве символа для общего типа. – Logicrat

1

Здесь мы идем (простой шаблон для суммы (...) функция):

template <typename T> 
T sum(const T* a, size_t count) { 
    T result = 0; 
    for (size_t i = 0; i < count; ++i) { 
     result += a[i]; 
    } 
    return result; 
} 

int main() { 
    const int intVals[] = { 0, 1, 2 }; 
    const float floatVals[] = { 0.F, 1.F, 2.F }; 

    const int intTotal = sum(intVals, 3); 
    const float floatTotal = sum(floatVals, 3); 

    std::cout << "float total: " << intTotal << std::endl; 
    std::cout << "int total: " << floatTotal << std::endl; 
} 

я как std::accumulate, хотя:

int main() { 
    const auto intVals = { 0, 1, 2 }; 
    const auto floatVals = { 0.F, 1.F, 2.F }; 

    const auto intTotal = std::accumulate(intVals.begin(), intVals.end(), 0); 
    const auto floatTotal = std::accumulate(floatVals.begin(), floatVals.end(), 0.0F); 

    std::cout << "float total: " << intTotal << std::endl; 
    std::cout << "int total: " << floatTotal << std::endl; 
} 
1

Реализация с участием параметров шаблона и использования из STL (стандартная библиотека С ++):

#include <iostream> 
#include <vector> 
#include <cstddef> 

template <typename T> 
T Sum(const std::vector<T>& a) { 
    T result = 0; 
    for (size_t i = 0; i < a.size(); ++i) { 
     result += a[i]; 
    } 
    return result; 
} 


int main() { 
    std::vector<int> intVals {0, 1, 2}; 
    std::vector<float> floatVals {0.F, 1.F, 2.F}; 

    int intTotal = Sum(intVals); 
    float floatTotal = Sum(floatVals); 

    std::cout << intTotal << std::endl; 
    std::cout << floatTotal << std::endl; 
} 

См Live Demo

+0

Вам действительно нужно указать '' или компилятор может вывести, что вектор 'intVals' состоит из' int'? – Ceros

+0

@Ceros Вы правы, его не нужно. –

Смежные вопросы