Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
TrueBit
96 / 96 / 47
Регистрация: 19.11.2012
Сообщений: 195
#1

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

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

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

Заполнение вектора из файла
Ребята, подскажите, как считать из файла числа типа double в вектор и вывести...

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

Заполнение вектора другим вектором
Есть два уже созданных вектора v и v2, со следующим содержимым: vector&lt;int&gt; v...

Вектора, заполнение двумерного массива
Здравствуйте дамы и господа. Вопрос конечно простой, но в тупик меня поставил и...

6
vovacreme
61 / 61 / 33
Регистрация: 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
96 / 96 / 47
Регистрация: 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
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
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
96 / 96 / 47
Регистрация: 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
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
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
96 / 96 / 47
Регистрация: 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
Привет! Вот еще темы с решениями:

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

Заполнение вектора случайными числами
Как сделать сортировку? Желательно подробно. И почему рандомные числа одни и те...

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

Заполнение вектора пользоватьельского типа данных
скажите пожалуйста, как добавлять элементы вектора функцией push_back(), если...


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

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

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