STL - итераторы

Dmitriy82

Можно ли получить доступ к типу итератора не через тип контейнера, а через
конкретный контейнер?
Допустим, имеется прога, в которой требуется хранить последовательность чисел.
Но я ещё не знаю, будет это list или vector. Пока пишу, например
list<int> sequence;
Затем мне потребуется её выводить, и определить итератор
for (list<int>::const_iterator i...
То есть, если я захочу поменять представление на vector, мне также придется менять
описание итераторов по всей программе.

olegusmaximus

то есть потом тебе нада быстро поменять list<int>?
наверное можно define сделать

Dmitriy82

Тогда для каждого списка придется писать
#define A_TYPE list<int>
A_TYPE a;
...
for (A_TYPE::const_iterator i=...
#undef A_TYPE
В принципе как вариант, но возможны конфликты имен - ведь у defin'ов нет вложенных
областей видимости. И в целом довольно некрасиво. Кстати, наверное вместо define
лучше использовать typedef. И всё же - неужели никак нельзя вместо
list<int>::iterator писать a::iterator ?!

margadon

Если у тебя есть несколько таких списков, то придётся хитрить. Если же только один, то просто берёшь typedef std::list<int> a ему делаешь и штампуешь себе итераторы вида a::iterator. Когда сильно прижмёт, поменяешь в хэдере на нужный тип.
(хотя создавать шаблононезависимый код, мне кажется, не есть гут)

ppplva

Вывод можно делать в функции, параметризованной типом итератора.
Или даже типом контейнера.

TYU_2008


#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <list>

const int size = 10;

using namespace std;

class Foo {
private:
int n;

public:
Foo(int x): n(x) { cout << "Constructor Foo called" << endl; }
Foo: n(0) { cout << "Constructor (default) Foo called" << endl; }
~Foo { cout << "Destructor Foo called" << endl; }
void set(int x) { n = x; }
const int get const { return n; }
void print const { cout << n << endl; }
};

int main {
vector<Foo*> foo(size);
list<Foo*> foo_l;

for (int i = 0; i < size; i++) {
foo[i] = new Foo(i * 2);
}

for (int i = 0; i < size; i++) {
Foo* tmp;
tmp = new Foo(i * 2);
foo_l.push_back(tmp);
}

for_each(foo.begin foo.end const_mem_fun_t<void, Foo>(&Foo::print;
cout << "===" << endl;
for_each(foo_l.begin foo_l.end const_mem_fun_t<void, Foo>(&Foo::print;

for (int i = 0; i < size; i++) {
delete foo[i];
}

return 0;
}

lenabarskaya


vector<Foo*> foo(size);
list<Foo*> foo_l;

for (int i = 0; i < size; i++) {
foo[i] = new Foo(i * 2);
}

for (int i = 0; i < size; i++) {
Foo* tmp;
tmp = new Foo(i * 2);
foo_l.push_back(tmp);
}

Словосочетание exception-safe тебе ни о чём не говорит?

TYU_2008

не-а, я ж c++ не знаю

TYU_2008

но а если серьезно, то маза в for_each была, хотя повторюсь - я не большой знаток c++, но про exeptions, конечно, знаю - это же искусственный пример, нефиг придираться

psihodog

можешь пояснить, ты про что?
Оставить комментарий
Имя или ник:
Комментарий: