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

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

Войти
Регистрация
Восстановить пароль
 
TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
#1

заполнение вектора по модулю - C++

02.02.2014, 19:22. Просмотров 391. Ответов 6
Метки нет (Все метки)

Заполняет вектор по модулю 2:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
 
int main() {
    srand(unsigned(std::time(0)));
    std::vector<int> vector(10);
 
    for(std::vector<int>::iterator it=vector.begin(); it!=vector.end(); it++)
        *it = rand()%2;
    return 0;
}
Как сделать код, выполняющий тоже самое без использования циклов for, while, do while, и без использования самописных функций для передачи в аргумент, коротко используя функции c++.

На ум приходит такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <functional>
 
int main() {
    srand(unsigned(std::time(0)));
    std::vector<int> vector(10);
 
    std::vector<int> vector2(10,2);
    std::generate(vector.begin(),vector.end(),rand);
    std::transform(vector.begin(),vector.end(),vector2.begin(),vector.begin(),std::modulus<int>());
 
    return 0;
}
Но как без дополнительного вектора? И чтобы диапазон можно было задать? Желательно чтобы весь алгоритм поместился в 2 строки функции(сейчас в 3 строки). И желательно стандарт ниже, чем c++11, чего-нибудь по универсальнее.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 19:22     заполнение вектора по модулю
Посмотрите здесь:

C++ Заполнение вектора структурами. Найдите ошибку.
Заполнение вектора другим вектором C++
Найти произведение элементов вектора, расположенных между максимальными и минимальными по модулю элементами C++
C++ Лямбда: заполнение вектора случайными числами
C++ Заполнение вектора функцией copy из бинарного файла
C++ Заполнение вектора пользоватьельского типа данных
Заполнение элементов вектора рандомными числами без повторений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vovacreme
-16 / 61 / 13
Регистрация: 14.01.2014
Сообщений: 145
02.02.2014, 19:58     заполнение вектора по модулю #2
Так не пойдет ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
 
int main() {
    srand(unsigned(std::time(0)));
    std::vector<int> vector(10);
    std::generate(vector.begin(),vector.end(), []() { return rand() % 2; });
    return 0;
}
TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
02.02.2014, 20:00  [ТС]     заполнение вектора по модулю #3
Придумал как для стандарта C++11 в одну строку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
 
int main() {
    srand(unsigned(std::time(0)));
    std::vector<int> vector(10);
 
    std::generate(vector.begin(),vector.end(),[] () { return (std::rand()%2); } );
 
    return 0;
}
Но как для стандарта C++98 ?

Добавлено через 1 минуту
Цитата Сообщение от vovacreme Посмотреть сообщение
Так не пойдет ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
 
int main() {
    srand(unsigned(std::time(0)));
    std::vector<int> vector(10);
    std::generate(vector.begin(),vector.end(), []() { return rand() % 2; });
    return 0;
}
Опередил. А стандарт C++98 как можно?
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
02.02.2014, 20:11     заполнение вектора по модулю #4
В C++11 rand по модулю на фиг не нужен, там uniform_int_distribution есть.
В C++98 можно
C++
1
2
std::transform(vector.begin(), vector.end(), vector.begin(),
  std::bind2nd(std::modulus<int>(), 2));
но vector всё равно из-за этого придётся делать int, чтобы туда сначала результаты rand'ов писать.
TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
02.02.2014, 21:58  [ТС]     заполнение вектора по модулю #5
Цитата Сообщение от Somebody Посмотреть сообщение
В C++11 rand по модулю на фиг не нужен, там uniform_int_distribution есть.
В C++98 можно
C++
1
2
std::transform(vector.begin(), vector.end(), vector.begin(),
  std::bind2nd(std::modulus<int>(), 2));
но vector всё равно из-за этого придётся делать int, чтобы туда сначала результаты rand'ов писать.
Еще бы с диапазоном и было бы норм. Например для диапазона значений [-10,10] можно так, но это как-то неприлично смотрится(к тому же 2 прохода transform):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <functional>
 
int main() {
    srand(unsigned(std::time(0)));
    std::vector<int> vector(10);
 
    std::generate(vector.begin(),vector.end(),rand);
    std::transform(vector.begin(),std::transform(vector.begin(),vector.end(),vector.begin(),std::bind2nd(std::modulus<int>(),21)),vector.begin(), std::bind2nd(std::minus<int>(),10));
 
    return 0;
}
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
02.02.2014, 22:05     заполнение вектора по модулю #6
C++
1
2
3
4
5
6
7
8
9
class RandRange
{
    int a, b;
public:
    RandRange(int a, int b) : a(a), b(b) { }
    int operator()() { return a + rand() % (b - a); }
};
...
std::generate(vector.begin(), vector.end(), RandRange(-10, 11));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2014, 22:09     заполнение вектора по модулю
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
02.02.2014, 22:09  [ТС]     заполнение вектора по модулю #7
Цитата Сообщение от Somebody Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
class RandRange
{
    int a, b;
public:
    RandRange(int a, int b) : a(a), b(b) { }
    int operator()() { return a + rand() % (b - a); }
};
...
std::generate(vector.begin(), vector.end(), RandRange(-10, 11));
Нужно без использования самописных функций(в т.ч. и самописных функций внутри класса). То есть только используя стандартные функции в main'е.
Yandex
Объявления
02.02.2014, 22:09     заполнение вектора по модулю
Ответ Создать тему
Опции темы

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