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

Лямбда: заполнение вектора случайными числами - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 23:20     Лямбда: заполнение вектора случайными числами #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
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <iterator>
 
typedef std::vector<int>   T_vec;
typedef std::vector<T_vec> T_matr;
 
using std::generate_n;
using std::cout;
using std::endl;
using std::copy;
 
 
int main()
{
    //почему так нельзя?
    //T_vec mas(10, []{return rand()%20;});
    
    T_vec mas2;
    generate_n(back_inserter(mas2), 10, []{return rand()%20;});
    copy(std::begin(mas2), std::end(mas2), std::ostream_iterator<int>(cout, " "));
}
Добавлено через 12 минут
хм... и почему перед back_inserter не нужно std:: ???

Добавлено через 1 минуту
и даже перед begin и end???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2012, 23:20     Лямбда: заполнение вектора случайными числами
Посмотрите здесь:

заполнение случайными числами C++
C++ заполнение случайными числами
C++ Заполнение строки случайными числами
C++ Заполнение массива случайными числами
Заполнение матрицы случайными числами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.01.2012, 23:25     Лямбда: заполнение вектора случайными числами #2
Вот заполнение
C++
1
std::generate(v.begin(), v.end(), [] () { return rand() % 20; });
Не совсем понял вопрос... Может это поможет.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 23:26  [ТС]     Лямбда: заполнение вектора случайными числами #3
Цитата Сообщение от go Посмотреть сообщение
Не совсем понял вопрос...
C++
1
2
//почему так нельзя?
//T_vec mas(10, []{return rand()%20;});
Добавлено через 29 секунд
Цитата Сообщение от go Посмотреть сообщение
Может это поможет.
вот оно
C++
1
generate_n(back_inserter(mas2), 10, []{return rand()%20;});
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.01.2012, 23:54     Лямбда: заполнение вектора случайными числами #4
Добавлено через 12 минут
хм... и почему перед back_inserter не нужно std:: ???
В этом виноват ADL
http://en.wikipedia.org/wiki/Argumen...nt_name_lookup

Если кратко, то в качестве областей для поиска ф-ии помино охватывающего скойпа еще используетя неймспейс, в котором объявлен тип, передаваемый в ф-ию. Яркий пример это operator <<. При написании std::cout << "abc"; нигде не указано, что нужно позвать ф-ию из простнанства std, однако функция находится благорадя ADL.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
26.01.2012, 00:10  [ТС]     Лямбда: заполнение вектора случайными числами #5

Не по теме:

DU, узнал много нового!!!



Добавлено через 5 минут
и нубский вопрос не по теме: почему некоторые функции или переменные называют foo?

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    operator<<(std::cout, "Hello C++ n00b");
    return 0;
}
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
26.01.2012, 00:13     Лямбда: заполнение вектора случайными числами #6
http://tools.ietf.org/html/rfc3092
Mayonez
26.01.2012, 00:20  [ТС]
  #7

Не по теме:

Paporotnik, многабукаф

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 00:41     Лямбда: заполнение вектора случайными числами #8
Цитата Сообщение от Mayonez Посмотреть сообщение
почему так нельзя?
Потому что не имеется перегруженного конструктора вектора, который принимает std::function (тип которого имеет лямбда).
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
26.01.2012, 15:38  [ТС]     Лямбда: заполнение вектора случайными числами #9
silent_1991, ну тогда еще вопрос: можно ли как-то упростить с помощью лямбда заполнение матрицы случайными числами или лучше сначала задать размер, а потом пройтись по всем элементам и заполнить?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 16:07     Лямбда: заполнение вектора случайными числами #10
Например, так:
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <ctime>
 
typedef int value_type;
typedef std::vector<value_type> line_type;
typedef std::vector<line_type> matrix_type;
 
int main()
{
    srand(unsigned(time(0)));
    
    value_type lb = 0, ub = 100;
    
    matrix_type matrix(3, line_type(3));
    
    for (auto& i : matrix)
        std::generate(std::begin(i),
                      std::end(i),
                      [=]() -> value_type
                      {
                          return value_type(lb + (ub - lb) * double(rand()) / RAND_MAX);
                      });
    
    for (auto& i : matrix)
    {
        std::copy(std::begin(i), std::end(i), std::ostream_iterator<value_type>(std::cout, "  "));
        std::cout << std::endl;
    }
    
    return 0;
}
Добавлено через 42 секунды
Цитата Сообщение от Mayonez Посмотреть сообщение
или лучше сначала задать размер, а потом пройтись по всем элементам и заполнить?
А по-другому вы и не сделаете.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
26.01.2012, 16:26  [ТС]     Лямбда: заполнение вектора случайными числами #11
[=]() -> value_type
C++
1
() -> value_type
не нужно, ведь вы явно приводите здесь
C++
1
value_type(lb + (ub - lb) * double(rand()) / RAND_MAX)
да и тут амперсанд не нужен ведь мы ничего не изменяем
C++
1
2
3
    for (auto& i : matrix)
    {
        std::copy
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 16:34     Лямбда: заполнение вектора случайными числами #12
Mayonez, 1. Предпочитаю явно указывать тип. Просто стиль.
2. Предлагаете копировать строки? А если матрица 10000 * 10000?
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
26.01.2012, 16:43  [ТС]     Лямбда: заполнение вектора случайными числами #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
2. Предлагаете копировать строки?
конечно нет, ну просто тогда:
C++
1
2
3
4
5
for (const auto& i : matrix)
    {
        std::copy(begin(i), end(i), std::ostream_iterator<value_type>(std::cout, "  "));
        std::cout << std::endl;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2012, 03:28     Лямбда: заполнение вектора случайными числами
Еще ссылки по теме:

заполнение матрицы случайными числами C++
Заполнение массива случайными числами C++
Заполнение вектора случайными числами C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.01.2012, 03:28     Лямбда: заполнение вектора случайными числами #14
Mayonez, да, так будет правильнее.
Yandex
Объявления
27.01.2012, 03:28     Лямбда: заполнение вектора случайными числами
Ответ Создать тему

Метки
лямбда, с++11
Опции темы

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