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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
Студент_игорь
0 / 0 / 0
Регистрация: 13.03.2011
Сообщений: 24
#1

Подсчет через count_if - C++

15.10.2011, 00:11. Просмотров 3215. Ответов 13
Метки нет (Все метки)

Есть, например, функция, принимающая 2 параметра
C++
1
2
3
4
bool BoolFunction ( параметр1, параметр2 )
{
    // что - то там
}
где параметр1 - это элемент типа вектора

нужно подсчитать в векторе, сколько элементов удовлетворяют условиям BoolFunction.

Сделать так не получается:
C++
1
count_if (v.begin(), v.end(), BoolFunction);
т.к. функция BoolFunction бинарная ( 2 параметра ), а не унарная.

Как можно еще подсчитать элементы вектора?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2011, 00:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчет через count_if (C++):

count_if - C++
Я где-то видел такое использование: count_if (a.begin(), a.end(), ...); (вместо троеточия что-то было). Не подскажете, что это за зверь...

Алгоритм count_if - C++
Помогите! Необходимо, используя алгоритм count_if посчитайте количество чисел в векторе, которые по модулю меньше 4. #include "stdafx.h" ...

Нужно переделать программу (accumulate_if() и count_if() ) - C++
#include <vector> #include <iostream> using namespace std; int main(int argc, char *argv) { int i, c, p=0 ,o=0; ...

Используя алгоритм count_if посчитать количество чисел в массиве - C++
Помогите с заданием! Используя алгоритм count_if посчитайте количество чисел в массиве, которые по модулю меньше 4. #include...

Подсчет времени через QueryPerformanceCounter - C++
Есть класс массив, есть функции сортировки: вставками, выбором, пузырьком и т.д. Нужно реализовать функцию для подсчета времени роботы...

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

13
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
15.10.2011, 00:15 #2
а зачем вы делаете её бинарной?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
15.10.2011, 00:16 #3
Если я Вас правильно понял, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include <algorithm>
 
int kol=0;
 
bool BoolFunction (int a)
{
    if (a/*условие*/) { kol++; return true;}
    else return false;
}
 
int main()
{
    std:: vector <int> a;
    for (int i=0;i<10;++i) a.push_back(i);
    std:: count_if (a.begin(),a.end(),BoolFunction);
    std:: cout << kol << "\n";
    system ("pause");
    return 0;
}
0
Студент_игорь
0 / 0 / 0
Регистрация: 13.03.2011
Сообщений: 24
15.10.2011, 00:19  [ТС] #4
у меня первый параметр - это точка ( тип - структура ( тип элементов вектора ) )
второй параметр - прямоугольник ( структура ( координаты ) )

Поэтому я хочу найти все элементы вектора ( точки ), удовлетворяющие условиям функции ( там проверка на попадание в область ).

Добавлено через 48 секунд
Dani, у меня ф-я принимает 2 параметра. Про такое использование count_if я знаю!
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
15.10.2011, 00:20 #5
Цитата Сообщение от Студент_игорь Посмотреть сообщение
Dani, у меня ф-я принимает 2 параметра.
1 обойтись можно - сделайте 1 глобальную переменную.
0
aeshes
441 / 204 / 13
Регистрация: 07.10.2011
Сообщений: 462
15.10.2011, 00:20 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
в STL есть связыватели, которые позволяют бинарную функцию использовать в алгоритмах на месте унарной - bnd2nd и bnd1st, но по формулировке задания не очень понятно, подойдут ли они вам

Вот пример использования
C++
1
2
3
4
5
6
7
8
9
#include <1ostream> 
#include <functional> 
#include <algorithm> 
using namespace std; 
int main(){ 
int m[8] = {45, 65, 36, 25, 674, 2, 13, 35}; 
cout<<count_if(m, m + 8, bind2nd(less<int>(), 40)); 
return 0; 
}
Вычисляет кол-во элементов, меньших 40
3
Студент_игорь
0 / 0 / 0
Регистрация: 13.03.2011
Сообщений: 24
15.10.2011, 00:23  [ТС] #7
aeshes, Спасибо, конечно, но у меня второе условие - попадание точки в определенную область...
0
aeshes
441 / 204 / 13
Регистрация: 07.10.2011
Сообщений: 462
15.10.2011, 00:30 #8
Студент_игорь, если ближе к постановке задачи: у тебя есть вектор точек и 1 прямоугольник и ты хочешь проверить все точки на попадание в него и посчитать их количество?
0
Студент_игорь
0 / 0 / 0
Регистрация: 13.03.2011
Сообщений: 24
15.10.2011, 00:33  [ТС] #9
aeshes, да!
0
Mut
5 / 5 / 0
Регистрация: 12.10.2011
Сообщений: 46
15.10.2011, 00:45 #10
может стоит сделать for_each для вектора точек и в вызываемой функцией делать проверку и подсчет совпадений?
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.10.2011, 00:58 #11
например
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
#include <functional>
#include <algorithm>
#include <iostream>
#include <vector>
 
template< typename T1, typename T2 >
struct BoolFunc : std::binary_function<T1, T2, bool> {
    bool operator () (const T1& a, const T2& b) const
    {
        return a % 2 == 0;
    }
};
 
int main()
{
    std::vector<int> vec;
    for (int i = 1; i < 11; ++i)
    {
        vec.push_back(i);
        std::cout << vec[i - 1] << ' ';
    }
 
    std::cout << '\n' 
              <<std::count_if(vec.begin(), vec.end(), std::bind2nd<BoolFunc<int, double>, double>(BoolFunc<int, double>(), 0.0))
              << '\n';
    
    return 0;
}
2
aeshes
441 / 204 / 13
Регистрация: 07.10.2011
Сообщений: 462
15.10.2011, 01:09 #12
вот, про точки и прямоугольник пример

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
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
 
struct Point
{
    int x,y;
    Point() { x=0; y=0;}
    Point(int _x, int _y) 
    {
        x=_x;
        y=_y;
    }
};
 
struct Rect
{
    Point top, bottom;
    Rect(int _x1, int _y1, int _x2, int _y2)
    {
        top.x=_x1;
        top.y=_y1;
        bottom.x=_x2;
        bottom.y=_y2;
    }
};
 
struct Predicate2: binary_function<Point, Rect, bool>
{
bool operator()(const Point& p, const Rect& r) const
{
    return (p.x>r.top.x && p.x<r.bottom.x && p.y>r.bottom.y && p.y<r.top.y);
}
};
 
int main()
{
    vector<Point> v;
    v.push_back(Point(1,1));
    v.push_back(Point(2,1));
    v.push_back(Point(3,1));
    v.push_back(Point(4,2));
 
    Rect a(0,3,3,0);
    cout<<count_if(v.begin(),v.end(), bind2nd(Predicate2(), a));
}
1
Студент_игорь
0 / 0 / 0
Регистрация: 13.03.2011
Сообщений: 24
15.10.2011, 23:05  [ТС] #13
Спасибо, aeshes, решение понравилось! =)
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.10.2011, 08:41 #14
Тут проще через лямбды сделать
Примерно так(в коде много лишнего, суть в 92-95 строках)
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
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
 
const double EPS = 0.00001;
 
struct point
{
    double x, y;
    explicit point( double _x, double _y )
    {
        x = _x;
        y = _y;
    }
    
    point() { }
    
};
 
class triangle
{
    point a, b, c;
 
public:
    
    explicit triangle( const point& _a, const point& _b, const point& _c)
    {
        a = _a;
        b = _b;
        c = _c;
    }
    
    triangle() { }
 
    bool include( const point& x ) const;
    
    double square() const;
    
    friend std::istream& operator >> ( std::istream& stream, triangle& t );
};
 
class rectangle
{
    point a, b, c, d;
    
public:
    
    explicit rectangle( const point& _a, const point& _b, const point& _c, const point& _d )
    {
        a = _a;
        b = _b;
        c = _c;
        d = _d;
    }
    
    bool include( const point& x ) const;
    
    friend std::istream& operator >> ( std::istream&, rectangle& p );
};
 
std::istream& operator >> ( std::istream& stream, point& p )
{
    stream >> p.x >> p.y;
    return stream;
}
 
std::istream& operator >> ( std::istream& stream, rectangle& r )
{
    stream >> r.a >> r.b >> r.c >> r.d;
    return stream;
}
 
std::istream& operator >> ( std::istream& stream, triangle& t )
{
    stream >> t.a >> t.b >> t.c;
    return stream;
}
 
int main()
{
    rectangle r( point(0, 0), point(2, 0), point(2, 2), point(0, 2) );
    
    std::vector < point > points = { point( 1, 1 ), point(3, 3), point(0, 0) };
    
    std::cout << std::count_if( points.begin(), points.end(), [&r] ( const point& p ) -> bool
    {
        return r.include(p);
    } );
}
 
 
 
double triangle::square() const
{
    return fabs( ( a.x * (b.y - c.y) + b.x * (c.y - a.y ) + c.x * (a.y - b.y ) ) / 2. );
}
 
bool triangle::include( const point& pt ) const
{
    return fabs( square()
        - triangle(a, b, pt).square()
        - triangle(b, c, pt).square()
        - triangle(c, a, pt).square() ) < EPS;
}
 
bool rectangle::include( const point& x ) const
{
    return triangle(a, b, c).include(x) || triangle(a, d, c).include(x);    
}
Результат: http://liveworkspace.org/code/2ae29722b6c5341923dbc4b72a4556bc
0
16.10.2011, 08:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2011, 08:41
Привет! Вот еще темы с ответами:

Подсчет кол-во букв в сторке через функцию - C++
Доброго всем здравия, помогите советом. Возможно ли произвести подсчет букв в строке через функцию?

Подсчет длины string, переданного через указатель - C++
Здравствуйте! Не могу получить длину строки string если она передана в функцию через указатель. Задача проста: передать в функцию через...

Задача на подсчет больничных через оператор switch - C++
Задача : Если стаж роботы до 3х лет , больничные - 50% от зарплаты , от 3х ло 5 лет - 60% , от 5 до 8 лет - 80 , больше 8 лет - 100% Не...

Написать програму, ведущую подсчет городских жителей, через структуру. - C++
Составить программу, в которой описывается структура из полей: Город, Количество жителей Количество родившихся в прошлом году, Количество...


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

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

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