STL - итераторы
наверное можно define сделать
#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 ?!
(хотя создавать шаблононезависимый код, мне кажется, не есть гут)
Или даже типом контейнера.
#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;
}
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 тебе ни о чём не говорит?
не-а, я ж c++ не знаю
но а если серьезно, то маза в for_each была, хотя повторюсь - я не большой знаток c++, но про exeptions, конечно, знаю - это же искусственный пример, нефиг придираться
можешь пояснить, ты про что?
Оставить комментарий
Dmitriy82
Можно ли получить доступ к типу итератора не через тип контейнера, а черезконкретный контейнер?
Допустим, имеется прога, в которой требуется хранить последовательность чисел.
Но я ещё не знаю, будет это list или vector. Пока пишу, например
list<int> sequence;
Затем мне потребуется её выводить, и определить итератор
for (list<int>::const_iterator i...
То есть, если я захочу поменять представление на vector, мне также придется менять
описание итераторов по всей программе.