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

Итератор "общего" типа. - C++

Восстановить пароль Регистрация
 
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
11.05.2012, 23:22     Итератор "общего" типа. #1
Хочу создать класс, который будет работать и итераторами на разные объекты (векторы, списки и т.д.)
Единственное решение, которое могу придумать - это шаблонный класс. Но мне, в принципе, хватило бы просто "общего" описания итератора.
Скажем опишу я поле своего класса как-то так:
C++
1
2
all_iterator begin;
all_iterator end;
и в конструкторе мне нужно будет в поля begin и end записать конкретные итераторы: списка, очереди, вектора, множества...
есть ли что-то похожее? или только шаблонный класс?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2012, 23:22     Итератор "общего" типа.
Посмотрите здесь:

МАССИВЫ: динамические мас.значение типа "int *" нельзя присвоить сущности типа "int" C++
C++ Error: значение типа "const char" нельзя присвоить сущности типа "double"
C++ значение типа "char *" нельзя присвоить сущности типа "LPWSTR"
аргумент типа "char *" несовместим с параметром типа "LPCWSTR" C++
C++ Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.05.2012, 23:41     Итератор "общего" типа. #2
Цитата Сообщение от IcyWind Посмотреть сообщение
Единственное решение, которое могу придумать - это шаблонный класс.
скорее всего
Цитата Сообщение от IcyWind Посмотреть сообщение
Но мне, в принципе, хватило бы просто "общего" описания итератора.
с++ не си и тут общего просто так не прокатит
наследованием эти контейнеры не связаны, поэтому строгая типизация без шаблонов вам не позволит просто так это сделать

ну и естественный вопрос - а зачем оно нужно?)
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
11.05.2012, 23:47  [ТС]     Итератор "общего" типа. #3
Создаю иерархию классов-сортировщиков

Добавлено через 5 минут
Чтобы не создавать новую тему...
пока решил писать не шаблонно, а только для вектора
не пойму...что делаю не так:
Файл класс.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
class Sort_Basic
{
    long start;
    long end;
    long size;
    vector<int>::iterator begin; //ругается
    vector<int>::iterator end;  //ругается
public:
    Sort_Basic(vector<int>::iterator, vector<int>::iterator); //не ругается почему-то..
файл класс.сpp:
C++ (Qt)
1
2
3
4
5
6
7
8
#include "StdAfx.h"
#include "Sort_Basic.h"
#include <vector>
using namespace std;
 
Sort_Basic::Sort_Basic(vector<int>::iterator b,vector<int>::iterator e)//ОЧЕНЬ СИЛЬНО ругается - когда пишу sort_Basic:: -> VS2010 в выпадающем списке не показывает конструктор!!!
    {
    }
IFree Host
Заблокирован
11.05.2012, 23:50     Итератор "общего" типа. #4
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну и естественный вопрос - а зачем оно нужно?)
Что то у меня такой же вопрос возник
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.05.2012, 23:54     Итератор "общего" типа. #5
IcyWind, какойнибудь небольшой кусок кода, который можно скомпилировать, приведите
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
11.05.2012, 23:55  [ТС]     Итератор "общего" типа. #6
Класс.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#pragma once
 
 
class Sort_Basic
{
    long start;
    long end;
    long size;
    vector<int>::iterator begin;
    vector<int>::iterator end;
public:
    Sort_Basic(vector<int>::iterator, vector<int>::iterator);
 
    //Sort_Basic(vector<int>::iterator,vector<int>::iterator,long);
 
template<typename T>
void IsSort(T, T);
 
virtual void Sort()=0;
 
virtual ~Sort_Basic(void);
 
    
};
Класс.cpp
C++ (Qt)
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
#include "StdAfx.h"
#include "Sort_Basic.h"
#include <vector>
using namespace std;
 
Sort_Basic::Sort_Basic(vector<int>::iterator b,vector<int>::iterator e)
    {
    }
 
template<typename T> // нужно указывать и в .cpp и в .h?
void Sort_Basic::IsSort(T b, T e)
    {
        --e;
        while (b!= e)
            {
                if (*b>*(++b))
                    cout<<"ВНИМАНИЕ! Последовательность неотсортирована!<===ERROR";
            }
        cout<<"Последовательность успешно отсортирована";
    }
 
 
Sort_Basic::~Sort_Basic(void)
    {
    }
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.05.2012, 00:03     Итератор "общего" типа. #7
#include <vector> - это должно быть в h файле сортировщика.
в h файле везде перед vector написать std::
шаблонную функцию нужно реализовать в h файле.
ну и еще ошибки компиляции в студию!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.05.2012, 00:07     Итератор "общего" типа. #8
Цитата Сообщение от IcyWind Посмотреть сообщение
template<typename T> // нужно указывать и в .cpp и в .h?
шаблоны описывают только в h

Добавлено через 1 минуту
Цитата Сообщение от IcyWind Посмотреть сообщение
long end;
Цитата Сообщение от IcyWind Посмотреть сообщение
vector<int>::iterator end;
плохая идея
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
12.05.2012, 00:26  [ТС]     Итератор "общего" типа. #9
Спасибки.
То есть все #include нужно пихать в .h файл?

Добавлено через 40 секунд
Цитата Сообщение от alex_x_x Посмотреть сообщение

Добавлено через 1 минуту


плохая идея
да, уже заметил
наверное, сплю уже))

Добавлено через 18 минут
C++ (Qt)
1
vector<int> v1,v2;
как-то их заполним
Есть ли разница между
C++ (Qt)
1
v1.swap(v2);
и
C++ (Qt)
1
swap(v1,v2)
Интересует не только результат, но и скорость работы и т.д.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.05.2012, 00:30     Итератор "общего" типа. #10
Цитата Сообщение от IcyWind Посмотреть сообщение
v1.swap(v2);
логика за то, что этот вариант быстрее
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2012, 11:38     Итератор "общего" типа.
Еще ссылки по теме:

Error C2678: бинарный "<<": не найден оператор, принимающий левый операнд типа "std::ifstream" C++
Бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" C++
Аргумент типа "unsigned char*" несовместим с параметром типа "const char*" C++

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 11:38     Итератор "общего" типа. #11
Цитата Сообщение от alex_x_x Посмотреть сообщение
логика за то, что этот вариант быстрее
По идее std::swap(...,...) должен быть специализирован для векторов, поэтому разницы быть не должно.
Yandex
Объявления
12.05.2012, 11:38     Итератор "общего" типа.
Ответ Создать тему
Опции темы

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