LINUX.ORG.RU

foreach в c++

 ,


1

4

Как я ждал этого!!!

Начал писать на php и использовать тамошний foreach. Удобная конструкция скажу я вам; заметил, что обычным for вообще почти перестал пользоваться. На C++ же делал по-старинке/по-привычке: for (int i=0;i<N;i++) . Это раз. Кроме того, в C++ очень напрягала работа с STL/итераторами: монструозные конструкции выходят.

Про развитие C++ читал, но никак не доходили руки. И вот решил попробовать:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
  vector<uint> v;

  v.push_back(3);
  v.push_back(5);
  v.push_back(6);

  // Вот здесь!!!
  for(auto i:v)
    cout << i << " ";

  cout << "\n";

  return 0;
}
$ g++ -std=c++11 delme3.cpp -o delme3 && ./delme3
3 5 6
Да здравствует более читабельный код!!!

Если кто еще не пробовал - рекомендую!

★★★★★

Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от procoder99

У него нет условий

«Поиск элементов полным проходом по массиву из 10 000 000 элементов (структур), содержащих 5 полей с диапазонами значений: amount_of_money(0-1000000), gender(0-1), age(0-100), code(0-1000000), height(0-300).»

Используется gcc.

Его решение на С: https://github.com/AlexeyAB/cpp_find_order/blob/da5190070863ded844452eda3a60f...

Kroz ★★★★★
() автор топика
Ответ на: комментарий от quasimoto

Валяй реальный пример. На абстрактные, нужные только анскилледам графы я клал.

Если тебе интересно страть фигнёй - дерзай, только меня не приплетай.

procoder99
()
Ответ на: комментарий от Kroz

Поиск элементов полным проходом по массиву из 10 000 000

Поиск по массиву из 10кк елементов, на полный проход я клал.

содержащих 5 полей с диапазонами значений

И на это я клал - диапазоны я возьму - на остальнео я клал.

Ты уже понимаешь, что он сольёт в хламину.

Но ради тебя так уж и быть - я буду юзать полный перебор, правда на структуры я клал.

Не показывай мне выхлоп этого неосилятора, пожалуйста. Это просто тотальный фейспалм.

Ах ну и да, ради тебя так уж и быть я возможно даже оставлю копирование результат, хотя скорее всего нет.

Хотя ладно, для первого варианта я оставлю.

В этом ваша бида, вы дрожите за изменение условий. В реальном мире такого нет - мои условия - это «код делает тоже самое», а как он делает - это не имеет значение.

Поэтому, чтобы ваш попец не бомбил - вы и продумали шаблоны и всякую байду, чтобы хоть какой-то свой щит оправдывать. Так не пишут труЪ пацаны - это ваши жалкие, детские игры в песочнице.

procoder99
()
Ответ на: комментарий от frugurt

вам наверное больше по душе, то что BlackHawk написал ?

Мне больше по душе вариант из C++11, или из python.

quiet_readonly ★★★★
()
Ответ на: комментарий от procoder99

Ты уже раскрасила карту в три цвета, грязная блядь? И вообще, что может знать о реальном мире ничтожное, нищее провинциальное школоебище?

anonymous
()
Ответ на: комментарий от cdshines

С чего я балабол? Я не обязан прогибаться под ущербанизмы анскилледа.

Вас этому учили всю жизнь, но мне это не интересно. Если ты написал задачку на шаблонной мути, то естественно ты написал её так, ибо ты анскиллед плюс к этому, если я запилю лучше - ты скажешь «ну она же не шаблонная, а что если я захочу поменять типы, etc».

С++ специально специализированный ЯП для оправдания сливов.

procoder99
()
Ответ на: комментарий от anonymous

А что может знать о реальном мире тот, кто считает MRI полезным для людей, когда его реальная польза на таком дне, что от боярышника пользы больше.

Ты можешь хоть что петь про то, как это технологично, но в реальном мире оно юзается больше для баловства. Реально оно помогает выявить что-то излечимое в 2-3% случаев и то чисто случайно( пациент просто форфан зашел и бам).

А уж если взять в среднем по кол-ву «спасённых жизней» оно валяется на таком днище, что от ашота, который вызвал скорую профита больше.

procoder99
()
Ответ на: комментарий от procoder99

Ну расскажи, опытный диагност, чем MRI бесполезен? Начни с бесполезности fMRI гойловного моска, и пробуй предложить альтернативы. Будет крайне интересно послушать очередной виток несусветноо бреда.

anonymous
()
Ответ на: комментарий от procoder99

Где той код, ничтожество? Где уравнение теплопроводности, рвущее все прочие решения на панамский флаг? Пока нет кода, ты балабол и говно.

anonymous
()
Ответ на: комментарий от procoder99

С++ специально специализированный ЯП для оправдания сливов.

тебе пора издаваться))

cdshines ★★★★★
()
Ответ на: комментарий от procoder99

Чтобы результаты были сравнимы, нужно чтобы задача была сравнима. А то потом скажут, что ты задачу упростил себе в угоду.

Как искать - твое дело, можешь полным проходом, можешь как-то по-другому. Результат - количество найденных записей.

Чтобы не вдаваться в полемику: вот «обертка», а сама суть (то, что нужно тебе написать) - функция search:

#include <stdio.h>      /* printf, scanf, NULL */
#include <stdlib.h>     /* calloc, exit, free */
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */

const size_t c_array_size = 10000000;

/* Fields */
enum T_field_enum { amount_of_money_e, gender_e, age_e, code_e, height_e,   /*<<<<<- add fields here */	last_e };

/* Row */
struct T_cash_account_row {
    unsigned code:20;			// 0 - 1000000
	unsigned gender:1;			// 0 - 1
	unsigned age:7;			    // 0 - 100	
	unsigned amount_of_money:20;// 0 - 1000000
	unsigned height:9;			// 0 – 300
};
/* ----------------------------------------------------------------------- */

/* Generate random data for the one row */
static inline struct T_cash_account_row generate_row() {
	struct T_cash_account_row cash_account_row;
	cash_account_row.age = rand() % 100;
	cash_account_row.amount_of_money = (rand() % 1000)*(rand() % 1000);
	cash_account_row.code = (rand() % 1000)*(rand() % 1000);
	cash_account_row.gender = rand() % 2;
	cash_account_row.height = rand() % 300;
	return cash_account_row;
}
/* ----------------------------------------------------------------------- */

/* Filters */
struct T_range_filters {
    struct T_cash_account_row begin, end;
    /* bytes array or bitset from https://gist.github.com/jmbr/667605 */
    unsigned char use_filter[last_e]; 
};
/* ----------------------------------------------------------------------- */

/* search */
static inline size_t search(struct T_cash_account_row const*const array_ptr, const size_t c_array_size,
	struct T_cash_account_row *const result_ptr, struct T_range_filters const*const range_filters) 
{
	/********************************************/
	/************ Это нужно написать ************/
	/********************************************/

}
/* ----------------------------------------------------------------------- */

int main() {
    
	size_t i; /* loop index */
    struct T_cash_account_row *const array_ptr = ( struct T_cash_account_row *)calloc(c_array_size, sizeof(struct T_cash_account_row));
    if (array_ptr == NULL) {
		printf ("calloc error\n");
		exit(1);
	}

	/* initialize random seed: */
	/* srand (time(NULL)); */

	/* Fill table random data */
	for(i = 0; i < c_array_size; ++i) 
		array_ptr[i] = generate_row();
	printf ("Generated rows: %d \n", c_array_size);

    struct T_range_filters range_filters = {};

	range_filters.use_filter[amount_of_money_e] = rand()%1 + 0;
	range_filters.use_filter[gender_e] = rand()%1 + 0;
	range_filters.use_filter[height_e] = rand()%1 + 0;

    range_filters.begin.age = rand() % 100;
    range_filters.end.age = range_filters.begin.age + 5;
    range_filters.use_filter[age_e] = rand()%1 + 1;

    range_filters.begin.code = rand() % 30000;
    range_filters.end.code = range_filters.begin.code + 5;
    range_filters.use_filter[code_e] = rand()%1 + 1;
    
    struct T_cash_account_row *const result_ptr = ( struct T_cash_account_row *)calloc(c_array_size, sizeof(struct T_cash_account_row));

	size_t result_size;
	clock_t end, start;

	printf ("C-Searching...\n");

	start = clock();
	result_size = search(array_ptr, c_array_size, result_ptr, &range_filters);
	end = clock();
	float c_took_time = (float)(end - start);
	printf ("C-search took %f seconds.\n", c_took_time/CLOCKS_PER_SEC);

	printf ("Found rows: %d \n", result_size);
    
	/*for(i = 0; i < result_size; ++i) {
		printf ("%d, %d, %d, %d, %d \n", 
			result_ptr[i].age, result_ptr[i].amount_of_money, result_ptr[i].code, result_ptr[i].gender, result_ptr[i].height);
	}*/

    int qwerty;
    scanf ("%d",&qwerty);
    return 0;
}

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Да, я упростил себе в угоду, ибо автор данной портянки не осилил этого.

Упрощение задачи - основа оптимизации, если ТС это не осилил - это не мои проблемы.

Ну и да, глянь на последнюю строчку - это покажет тебе уровень того писуна. Знаешь что это? Это маздайский кастыль, чтобы его консолька в мсвс не закрывалась сразу. Причем кастыль уровня студента 1-го курса и он выкатил это публике.

procoder99
()
Ответ на: комментарий от procoder99

Упрощение задачи - основа оптимизации, если ТС это не осилил - это не мои проблемы.

Ты можешь упрощать алгоритм (реализацию), сколько тебе заблагорассудится, но ты не можешь упрощать постановку задачи.

Короче, постановка задачи - это «обертка» в моем предыдущем посте. Задача - функция search.

Ну и да, глянь на последнюю строчку - это покажет тебе уровень того писуна. Знаешь что это? Это маздайский кастыль, чтобы его консолька в мсвс не закрывалась сразу. Причем кастыль уровня студента 1-го курса и он выкатил это публике.

:)) Да, я тоже заметил.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Ты можешь упрощать алгоритм (реализацию), сколько тебе заблагорассудится, но ты не можешь упрощать постановку задачи.

Условия задачи - есть 10кк индексов - каждый индекс имеет пару полей( как это реализованно не имеет значение), которе могут хранить определённые значения.

Моя задача из заранее созданных 10кк елементов из которых я могу получит набор значений, котоыми из заполнил рандом НАЙТИ ВСЕ елементы, которые подходят под мой «шаблон».

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

Короче, постановка задачи - это «обертка» в моем предыдущем посте. Задача - функция search.

Я даже смотреть на этот щит не буду.

procoder99
()
Ответ на: комментарий от Kroz

procoder99, похоже, ниасилит, а мне задача показалась интересной. Ну, не настолько чтоб прям морщить лоб неделями, но попробовать можно. Вот что получилось по-быстрому.

Делаем генератор кода:

#include <stdio.h>

int
main()
{
        char *fields[] = {"code", "amount_of_money", "height", "age", "gender", NULL};
        size_t fsize = 0;
        size_t i;

        for (i=0; fields[i]; i++) {
                fsize++;
        }

        for (i=0; i<(1 << fsize); i++) {
                int j;

                printf("if (");
                for (j=0; j<fsize; j++) {
                        int r = (i >> j) & 1;
                        printf(" %srange_filters->use_filter[T_cash_account_row::%s_e]", r ? " ":"!", fields[j]);
                        if (j != (fsize-1)) printf(" && ");
                }
                printf(") {\n");
                printf(" for (i = 0; i < c_array_size; i++) {\n");
                for (j=0; j<fsize; j++) {
                        int r = (i >> j) & 1;
                        if (r) {
                                printf("  if ((array_ptr + i)->%s < range_filters->begin.%s) continue;\n", fields[j], fields[j]);
                                printf("  if ((array_ptr + i)->%s > range_filters->end.%s) continue;\n", fields[j], fields[j]);
                        }
                }
                printf(" result_ptr[result_size] = array_ptr[i], ++result_size;\n");
                printf(" }\n");
                printf("}\n\n");
        }

        return 0;
}

Запускаем его, выхлоп в какой-то файл, скажем в gencond.i.

В функции search заменяем «for(i = 0; i < c_array_size; ++i) {...}» на «#include „gencond.i“», собираем и запускаем.

За несколько запусков меня С++ получился где-то в 0,96 раза быстрее С

Deleted
()
Ответ на: комментарий от cdshines

А какая у тебя работа, если не секрет? Хотя бы в общих чертах - драйвера, эмбеддед, прикладуха етс... ?

Судя по стилю написания комментариев, бреду, пены и соплей, он еще ученик средней школы. И там, в реале, ему дают просраться по полной.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.