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

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

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

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

02.02.2014, 19:22. Просмотров 406. Ответов 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, чего-нибудь по универсальнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 19:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос заполнение вектора по модулю (C++):

Заполнение вектора векторов - C++
Изучаю вектора, поискал похожие темы до 14 года, вроде бы разные варианты перепробовал из поиска, подскажите, что не так, почему не...

Заполнение вектора в цикле - C++
Попробовал так (для освоения материала) #include &lt;vcl.h&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; //sort ...

Заполнение вектора из файла - C++
Ребята, подскажите, как считать из файла числа типа double в вектор и вывести на экран? А также потом записать в файл?

Вектора, заполнение двумерного массива - C++
Здравствуйте дамы и господа. Вопрос конечно простой, но в тупик меня поставил и не могу понять как быть в данной ситуации. Но все по...

Заполнение вектора случайными числами - C++
как с помощью функции rand() заполнить вектор случайными числами из промежутка, причем границы промежутка пользователь указывает...

Заполнение вектора случайными числами - C++
Как сделать сортировку? Желательно подробно. И почему рандомные числа одни и те же? #include &lt;windows.h&gt; #include &lt;sstream&gt; #include...

6
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;
}
1
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 как можно?
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,197
Завершенные тесты: 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'ов писать.
1
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;
}
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,197
Завершенные тесты: 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));
1
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'е.
0
02.02.2014, 22:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2014, 22:09
Привет! Вот еще темы с ответами:

Заполнение вектора другим вектором - C++
Есть два уже созданных вектора v и v2, со следующим содержимым: vector&lt;int&gt; v = {5, 3, 1, 3, 5, 2, 5, 3, 1, 3, 5, 2, 5}; vector&lt;int&gt; v2...

Найти произведение элементов вектора, расположенных между максимальными и минимальными по модулю элементами - C++
Задайте два вектора А(n) и B(m). выполните задания: 1)найдите вектора С(n+m) с элементов векторов А и Б, сначала парных в порядке...

Массив: Заполнение двумерного вектора с клавиатуры - C++
Доброго времени суток. Хотелось бы узнать, возможно ли заполнение двумерного вектора с клавиатуры? Имеется ввиду ввод количества...

Лямбда: заполнение вектора случайными числами - C++
хотел заполнить вектор случайными числами с помощью лямбда, но че то ничего не получилось... #include &lt;iostream&gt; #include &lt;vector&gt; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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