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

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

Восстановить пароль Регистрация
 
Виталий123
-96 / 5 / 2
Регистрация: 29.11.2011
Сообщений: 84
15.11.2012, 23:42     Как сделать, чтобы класс обрабатывал по одному элементу vector #1
привет всем ! как сделать так чтобы класс обрабатывал по одному элементу 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 23:42     Как сделать, чтобы класс обрабатывал по одному элементу vector
Посмотрите здесь:

как сделать чтобы дружественная функция классу принимал ааргумент типа "класс" который при создании ничем не инициализирован? C++
vector<int>* v; обращение к конкретному элементу C++
STL обращение к элементу vector C++
Сортировка по одному из полей std::vector C++
C++ Как сделать чтобы класс возвращал значение своего поля?
C++ Доступ к элементу структуры, массив которых хранится в vector
C++ Как вывести на екран структуру/класс через vector или list
C++ Обращение к предпоследнему элементу vector

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
16.11.2012, 00:23     Как сделать, чтобы класс обрабатывал по одному элементу vector #2
Виталий123, ну и передавайте в конструктор один элемент, а не вектор из 10 элементов
Виталий123
-96 / 5 / 2
Регистрация: 29.11.2011
Сообщений: 84
16.11.2012, 00:54  [ТС]     Как сделать, чтобы класс обрабатывал по одному элементу vector #3
I.M., да уже нашел как решить проблему...ну все равно благодарю за предоставленную помощь...
Yandex
Объявления
16.11.2012, 00:54     Как сделать, чтобы класс обрабатывал по одному элементу vector
Ответ Создать тему
Опции темы

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