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

Линейный поиск в массиве и списке - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Чтение из файла http://www.cyberforum.ru/cpp-beginners/thread963019.html
Как вывести содержимое ранее созданных файлов на на экран? Вот кусок кода. Открыть то я открыл, а построчно вывести не могу, не знаю что написать) do { scanf("%i", &k); switch(k) { case 1: {file = fopen(FileName,"r"); break; } case 2: {file = fopen(FileNameR,"r"); break; } case 3: {system("cls"); main();} }
C++ Нужно отсортировать методом Шелла с++ #include "stdafx.h" #include <iostream> #include<cstdlib> #include<ctime> using namespace std; int main () {const int n=3;const int m=3; int a; srand(time(NULL)); int i,j; http://www.cyberforum.ru/cpp-beginners/thread963013.html
Быстрый поиск супернатуральных чисел C++
Натуральное число будем называть супернатуральным, если в своем десятичном виде оно не содержит единиц, а произведение всех его цифр равно n. Для заданного n выясните, сколько существует супернатуральных чисел. Технические условия Входные данные: Содержит одно целое число n, не превосходящее 2×109. Выходные данные: Вывести количество супернатуральных чисел по модулю 101. Информация о...
C++ Найти координаты четвертой вершины параллелограмма
Привет всем. Вот задали совсем простенькую задачку: Известно, что точки с координатами (x1, y1), (x2, y2), (x3, y3) являются тремя вершинами некоторого параллелограмма. Найти координаты четвертой вершины. Все бы хорошо, но я не знаю как ее решить, не как написать код, а саму геометрическую часть, т.е. алгоритм, помогите пожалуйста :)
C++ Чёрный ящик или белый ящик http://www.cyberforum.ru/cpp-beginners/thread962982.html
Всем привет. Задали программу написать a + b и сумму вывести в файл, а птом протестировать либо на чёрный ящик, либо на белый ящик. Я лекции прочитал и инфу. в нете, вроде понял , а как писать не знаю. вот код программы подкиньте идеи и код(тестора) , в первый раз на наглядном примере будет легче понять и разобраться спасибо - НАРОД. #include <stdio.h> long a,b; int main(){ ...
C++ Как реализировать заполнение массива квадратами? Я создал програму которая заполняет двумерный масив символами 35, а потом в рандомных местах создает прямоугольники символами 46, мне нужно чтобы все квадраты были связаны друг с другом линиями из знаков 46, как это осуществить? подробнее

Показать сообщение отдельно
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
27.09.2013, 11:01     Линейный поиск в массиве и списке
Цитата Сообщение от whhandrey Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int LinearSearch(T* begin, T* end, T key)
{
    //bool a=false;
    T* it;
    int i=0;
    for(it=begin; it!=end; it++)  // вот тут. как перегрузить этот оператор?
    {
        if(*it == key)
        {
            return i;
        }
        i++;
    }
    return -1;
}
Для указателей уже определен этот оператор. Олсо гляньте пункт 4. Операции с указателями

Ваш код работает и компилируется у меня:
C++
1
2
3
4
5
6
7
    vector<int> v;
    cin>>v; // перегружен
    int key = 20;
    int pos = LinearSearch(&v[0], &v[0]+v.size(),key);
 
    if(pos!=-1) cout << "Index of " << key << " == " << pos << endl;
        else cout << key << " not found" << endl;
При описании примера для работы со стандартным вектором, я ошибся.
Если vector<some_class> v; то v.begin() ( как и v.end()) не является указателем на some_class, а имеет тип vector<some_class>::iterator.
Для того чтобы Ваша функция работала со контейнерами STL (vector, list, ect), нужно определить её по другому:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class Iter>
int LinearSearch(Iter begin, Iter end, Iter key)
{
    int i=0;
    for(Iter it=begin; it!=end; it++) 
    {
        if(*it == *key) {
            return i;
        }
        i++;
    }
    return -1;
}
Для итераторов STL контейнеров как минимум перегружены операции инкремента и разыменования.
Теперь функцию можно использовать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    vector<int> v;
    v.push_back(555); 
    cin>>v;
    vector<int>::iterator key = v.begin();
    int pos = LinearSearch(v.begin()+1, v.end(), key); // ищем второе вхождение 555
    if(pos!=-1) cout << "Index of second entry of " << *key << " == " << pos << endl;
    else cout << "There is no second entry of " << *key << endl;
 
    double ar[5] = { 100.1, 200.2, 300.3, 400.4, 500.5 };
    double* key2 = new double(300.3);
    pos=LinearSearch(ar, ar+5, key2);
    cout << "Index of " << *key2 << " == " << pos << endl;
Добавлено через 1 час 18 минут
или так
C++
1
2
template<class Iterator, class value_type>
int search(Iterator first, Iterator last, const value_type& val)
 
Текущее время: 17:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru