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

Правильно ли выполнено задание - C++

Восстановить пароль Регистрация
 
KostyaKulakov
Заблокирован
21.02.2013, 16:35     Правильно ли выполнено задание #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
#include <iostream>
#include <vector>
#include <string>
 
size_t size_vector_string(std::vector<std::string> vector);
 
int main()
{
    std::vector<std::string> test;
 
    test.push_back("C++");
    test.push_back("The");
    test.push_back("Best");
    test.push_back(":)");
 
    std::cout << size_vector_string(test);
 
    return 0;
}
 
size_t size_vector_string(const std::vector<std::string> vector)
{
    const size_t size = vector.size();
 
    size_t string_symbol = 0;
 
    for(int i=0; i < size; ++i)
        string_symbol += vector.at(i).size();
 
    return string_symbol;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
unit7
30 / 30 / 4
Регистрация: 07.08.2012
Сообщений: 86
21.02.2013, 16:50     Правильно ли выполнено задание #2
Да.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
21.02.2013, 17:08     Правильно ли выполнено задание #3
Неплохо бы еще передавать вектор по ссылке.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.02.2013, 17:53     Правильно ли выполнено задание #4
В принципе, тоже самое, но я бы так написал:
C++
1
2
3
4
5
6
size_t size_vector_string(const std::vector<std::string>& v)
{
    size_t ret = 0;
    std::for_each(v.begin(), v.end(), [&ret](const std::string& s){ret += s.size();});
    return ret;
};
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
21.02.2013, 18:28     Правильно ли выполнено задание #5
C++
1
2
3
4
5
size_t size_vector_string(const std::vector<std::string>& v)
{
    return std::accumulate(v.begin(), v.end(), 0u,
                [](size_t sum, const std::string& str) { return sum + str.size(); });
}
KostyaKulakov
Заблокирован
21.02.2013, 18:31  [ТС]     Правильно ли выполнено задание #6
Цитата Сообщение от yuron_477 Посмотреть сообщение
В принципе, тоже самое, но я бы так написал:
C++
1
2
3
4
5
6
size_t size_vector_string(const std::vector<std::string>& v)
{
    size_t ret = 0;
    std::for_each(v.begin(), v.end(), [&ret](const std::string& s){ret += s.size();});
    return ret;
};
ваш метод чутка медленный из-а использования for_each, желательно бы вынести v.end() и v.begin в переменные, ибо они инициируются каждый раз при выполнение цикла.

также лямбды лучше показывать вот так
C++
1
2
3
[]()
{
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
21.02.2013, 18:48     Правильно ли выполнено задание #7
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
ваш метод чутка медленный из-а использования for_each, желательно бы вынести v.end() и v.begin в переменные, ибо они инициируются каждый раз при выполнение цикла.
Это вы сами придумали?
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
также лямбды лучше показывать вот так
Вопрос вкуса. На мой взгляд, лямбды длиннее одной строки вообще не имеют смысла(имею в виду, если использовать их так, как это сделано у меня и у yuron_477), а следовательно и не требуют какого-то особого оформления.
Demy85
58 / 58 / 5
Регистрация: 28.05.2012
Сообщений: 211
Завершенные тесты: 1
21.02.2013, 19:06     Правильно ли выполнено задание #8
Предопределение функции должно содержать const в параметре.
KostyaKulakov
Заблокирован
21.02.2013, 19:23  [ТС]     Правильно ли выполнено задание #9
Цитата Сообщение от rangerx Посмотреть сообщение
Это вы сами придумали?

Вопрос вкуса. На мой взгляд, лямбды длиннее одной строки вообще не имеют смысла(имею в виду, если использовать их так, как это сделано у меня и у yuron_477), а следовательно и не требуют какого-то особого оформления.
нет. каждый раз цикл обращается к v.end и v.begin. те заново вызывает функцию, затрачивая больше времени, чем обращаясь к уже заранее инициализированной переменной.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 20:00     Правильно ли выполнено задание
Еще ссылки по теме:

Можете сказать, я правильно понял задание? C++
Операторы цикла (задание должно быть выполнено всеми тремя типами циклов) C++
Как правильно выполнить задание? C++

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.02.2013, 20:00     Правильно ли выполнено задание #10
KostyaKulakov, вот взгляните на реализацию for_each. Переменным first и last присваивается значения итераторов begin() и end() и дальше алгоритм работает только с first и last. Цикл каждый раз не обращается к v.end() и v.begin() и никакого замедления не происходит.
C++
1
2
3
4
5
6
7
8
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
    for (; first != last; ++first) {
        f(*first);
    }
    return f;
}
Вот ели б вы так написали:
C++
1
for (auto it = test.begin(); it != test.end(); ++it);
, то да, здесь на каждой итерации цикла бы высчитывалось it != test.end() и тут лучше завести новую переменную и присвоить ей test.end() или так писать:
C++
1
for (std::vector<std::string>::iterator it = test.begin(), end = test.end(); it != end; ++it);
Yandex
Объявления
21.02.2013, 20:00     Правильно ли выполнено задание
Ответ Создать тему
Опции темы

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