3 / 5 / 1
Регистрация: 29.11.2011
Сообщений: 84
1

Как сделать, чтобы класс обрабатывал по одному элементу vector

15.11.2012, 23:42. Показов 443. Ответов 2
Метки нет (Все метки)

привет всем ! как сделать так чтобы класс обрабатывал по одному элементу vector r, g, b, состоящий из 10 элементов а то у меня получается что когда когда пишешь такой цикл
C++
1
2
3
4
5
6
7
for(int i = 0; i < 10; i++)
    {
        r.push_back((rand() % 256) );
        g.push_back((rand() % 256) );
        b.push_back((rand() % 256) );
        
    }
у меня обрабатывает класс сразу все 10 элементов vector r, g, b.
а если так записать
C++
1
2
3
4
5
6
7
8
for(int i = 0; i < 10; i++)
    {
        r.push_back((rand() % 256) );
        g.push_back((rand() % 256) );
        b.push_back((rand() % 256) );
                rgb2hsl(r, g, b);
        
    }
, то обрабатывает каждый элемент на единицу больше(т.е 1 элемент, потом 2 элемента, 3 элемента и т.д) что нужно для этого изменить в конструкторе или в клиентской области ? вот код весь код
класс
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#pragma once
 
#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
class rgb2hsl
{
public:
    rgb2hsl(vector<double>& r, vector<double>& g
        , vector<double>& b): R(r.begin(), r.end()), G(g.begin(), g.end())
        , B(b.begin(), b.end()) 
    {
        cout<<"R  ";
        copy(R.begin(), R.end(), ostream_iterator<double>(cout, " ")); cout<<endl;
        cout<<"G  ";
        copy(G.begin(), G.end(), ostream_iterator<double>(cout, " ")); cout<<endl;
        cout<<"B  ";
        copy(B.begin(), B.end(), ostream_iterator<double>(cout, " ")); cout<<endl;
    }
    vector<double>::iterator MIN(vector<double>& A, vector<double>& C)
    {
        vector<double>::iterator  j, i;
        j = min_element(A.begin(), A.end());
        i = min_element(C.begin(), C.end());
        if(*j <= *i) return j;
        else return i;
    }
    vector<double>::iterator MIN3()
    {
        vector<double>::iterator j, i;
        j = min_element(R.begin(), R.end());
        i = min_element(G.begin(), G.end());
        if(*j <= *i) return MIN(R, B);
        else return MIN(G, B);
    }
    vector<double>::iterator MAX(vector<double>& A, vector<double>& C)
    {
        vector<double>::iterator j, i;
        j = max_element(A.begin(), A.end());
        i = max_element(C.begin(), C.end());
        if(*j >= *i) return j;
        else return i;
    }
    vector<double>::iterator MAX3()
    {
        vector<double>::iterator j, i;
        j = max_element(R.begin(), R.end());
        i = max_element(G.begin(), G.end());
        if(*j >= *i) return MAX(R, B);
        else return MAX(G, B);
    }
    vector<double> resultMaxMin()
    {
        vector<double> j, i, result;
        j.push_back(*MAX3()); i.push_back(*MIN3());
        transform(j.begin(), j.end(), i.begin(), back_inserter(result), minus<double>());
        return result;
    }
    bool findR()
    {
        for(auto r1 = R.begin(); r1 != R.end(); ++r1)
            if(*r1 == *MAX3()) return true;
        return false;
    }
    bool findG()
    {
        for(auto g1 = G.begin(); g1 != G.end(); ++g1)
            if(*g1 == *MAX3()) return true;
        return false;
    }
    bool findB()
    {
        for(auto b1 = B.begin(); b1 != B.end(); ++b1)
            if(*b1 == *MAX3()) return true;
        return false;
    }
    vector<double> H()
    {
        double x(60.0), y(0.0), z(360.0), q(120.0), w(240.0);
        double* value6 = &x; double* value0 = &y; double* value3 = &z;
        double* value2 = &q; double* value24 = &w;
        vector<double> result(R.size());
        auto r1 = R.begin(); auto g1 = G.begin(); auto MaxMin = resultMaxMin()[0];
        auto b1 = B.begin(); auto rst = result.begin();
        if(*MAX3() == *MIN3())
            *rst = 0;
        else if(findR())
        {
            for(; g1 != G.end(), b1 != B.end(), rst != result.end(); ++g1, ++rst, ++b1)
            {
                if(*g1 >= *b1)
                    *rst = *value6 * ((*g1 - *b1) / MaxMin) + *value0;
                else if(*g1 < *b1)
                    *rst = *value6 * ((*g1 - *b1) / MaxMin) + *value3;
            }
        }
        else if(findG())
            for(; b1 != B.end(), r1 != R.end(), rst != result.end(); ++b1, ++rst, ++r1)
                *rst = *value6 * ((*b1 - *r1) / MaxMin) + *value2;
        else if(findB())
            for(; r1 != R.end(), g1 != G.end(), rst != result.end(); ++r1, ++rst, ++g1)
                *rst = *value6 * ((*r1 - *g1) / MaxMin) + *value24;
        return result;
    }
    vector<double> L()
    {
        double x(2.0); double* value = &x;
        double z(100.0); double* value1 = &z;
        double t(255.0); double* value25 = &t;
        vector<double> result(R.size());
        vector<double> r3(R.size()); auto re = r3.begin();
        auto rst = result.begin(); auto maxx = *MAX3();
        auto minn = *MIN3();
        for(; rst != result.end(), re != r3.end(); ++rst, ++re) 
            *rst = (((maxx + minn) / *value) * *value1) / *value25;
        return result;
    }
    vector<double> S()
    {
        double y(2.0); double* value2 = &y; double z = 100.0;
        double* value1 = &z; double u = 0.5; double* value12 = &u;
        vector<double> result(R.size()); auto rst = result.begin();
        vector<double> rr(R.size()); auto rr1 = rr.begin();
        auto l = L(); auto ll = l.begin(); auto MaxMin = resultMaxMin()[0];
        auto maxx = *MAX3(); auto minn = *MIN3();
        for(; rst != result.end(), ll != l.end(); ++rst, ++ll)
        {
            
            if(*ll <= *value12)
                *rst = (MaxMin / (maxx + minn)) * *value1;
            else
                *rst = (MaxMin / (*value2 - maxx - minn)) * *value1;
        }
        return result;
    }
private:
    vector<double> R; vector<double> G; vector<double> B;
};
клиентская область


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 "stdafx.h"
#include "rgb2hsl.h"
#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <conio.h>
 
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    vector<double> r, g, b;
    for(int i = 0; i < 10; i++)
    {
        r.push_back((rand() % 256) );
        g.push_back((rand() % 256) );
        b.push_back((rand() % 256) );
        
    }
    rgb2hsl rgb(r, g, b);
    cout<<"Min "<<*rgb.MIN3()<<endl;
    cout<<"Max "<<*rgb.MAX3()<<endl;
    cout<<"resultMaxMin "<<rgb.resultMaxMin()[0]<<endl;
    auto hh = rgb.H(); auto ll = rgb.L(); auto ss = rgb.S();
    //////////////////////////////////////////////////////////////////////////
    cout<<endl;
    copy(hh.begin(), hh.end(), ostream_iterator<double>(cout, " ")); cout<<endl<<endl;
    copy(ss.begin(), ss.end(), ostream_iterator<double>(cout, " ")); cout<<endl<<endl;
    copy(ll.begin(), ll.end(), ostream_iterator<double>(cout, " ")); cout<<endl<<endl;
    _getch();
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2012, 23:42
Ответы с готовыми решениями:

Как сделать переход к следующему элементу в STL vector
Есть пример с книги по STL, и я его решил модернизировать: 1) Дописать код который выводит...

Как сделать так, чтобы только один виджет всегда обрабатывал события keyPressEvent?
У меня есть виджет который обрабатывает события нажатия клавиш. Рядом с ним расположен другой...

Как сделать так, чтобы события мыши обрабатывал QScrollArea, а не виджет, находящийся в нем?
Как сделать так, чтобы события мыши обрабатывал QScrollArea, а не виджет, находящийся в нем? По...

Как сделать так, чтобы php скрипт поочередно обрабатывал картинки поступившие после разархивации в папку?
Здравствуйте, программисты! Не понимаю, как сделать так, чтобы скрипт, который обрабатывает...

2
572 / 555 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
16.11.2012, 00:23 2
Виталий123, ну и передавайте в конструктор один элемент, а не вектор из 10 элементов
1
3 / 5 / 1
Регистрация: 29.11.2011
Сообщений: 84
16.11.2012, 00:54  [ТС] 3
I.M., да уже нашел как решить проблему...ну все равно благодарю за предоставленную помощь...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2012, 00:54

Как настроить XAMPP, чтобы он не обрабатывал URL запросы?
Здравствуйте! Целый день искал ответ на свой вопрос в интернете, ответа не нашёл. Проблема такая:...

Как сделать так, чтобы несколько клиентов подключались к одному серверу?
Приветствую!У меня есть 2 кода для клиента и сервера,осуществлённые через сокеты: Клиент...

Как сделать, чтобы клавиша Delete стирала по одному значению а не сразу все?
VK_Delete: begin s:=''; r:=0; clearwindow; как сделать чтобы клавиша Delete стирала по одному...

Уникальный foreign key. Как сделать, чтобы одному users соответствовала одна запись из profiles
Используется подсистема InnoDB. Есть две таблицы: users (пользователи), profiles (информация о...


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

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

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