powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос об STL
18 сообщений из 18, страница 1 из 1
вопрос об STL
    #34013244
matsic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обычное задание вектора с целыми числами.
Код: plaintext
vector<int> x1;

А как задать вектор массивов челых чисел, что бы обращаться к ним так:
Код: plaintext
int t=x2[ 1 ][ 2 ]
где x2 - вектор, каждым елементом которого является массив на девять элементов типа int?
Попытка задать вектор как
Код: plaintext
vector<int[ 9 ]> x2;
ничего не дает. Компилятор сообщает об ошибке.
Можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
struct int9
{
int a[ 9 ];
};
vector <int9> x2;
.......
int t=x2[ 1 ].a[ 2 ];
так работает.
А можно ли это сделать без обьявления структуры?
...
Рейтинг: 0 / 0
вопрос об STL
    #34013292
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может стоит попробовать задать typedefом. Или создать вектор с типом указателя на инт
...
Рейтинг: 0 / 0
вопрос об STL
    #34013307
matsic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И как можно typedefом? Дайте примеры! :)
...
Рейтинг: 0 / 0
вопрос об STL
    #34013326
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я помню, тип, хранящийся в векторе должен иметь переопределенные операторы == и >

поэтому можно например сделать вектор векторов и к нему обращаться как к многомерному.

Код: plaintext
1.
2.
3.
4.
5.
typedef vector<int> vvv;
vector<vvv> v;
v.push_back(vvv());
v[ 0 ].push_back( 3 );
cout<<v[ 0 ][ 0 ]<<endl;
...
Рейтинг: 0 / 0
вопрос об STL
    #34013341
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
matsic...А можно ли это сделать без обьявления структуры?

OFF/2
простите, что немного не по теме...
И со структурой..но думаю, что может подтолкнуть на какие нить мысли...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct Index
{
  int x;
  int y;
  Index(int ex, int why) : x(ex), y(why) {}
  bool operator==(const Index& i) { return x == i.x && y == i.y; }
};

class WorksFine
{
public:
  Foo& operator[](Index i);
};

  array[Index( 17 ,  29 )].MemberOfFoo();

это пример из одной книги...

с уважением
(круглый)
...
Рейтинг: 0 / 0
вопрос об STL
    #34013368
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
matsicИ как можно typedefом? Дайте примеры! :)

Это лишь мои предположения.

Код: plaintext
1.
2.
typedef int[ 9 ] i9;
typedef int *pi; 

Вообще, --null-- предложил хороший вариант
...
Рейтинг: 0 / 0
вопрос об STL
    #34013905
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--Насколько я помню, тип, хранящийся в векторе должен иметь переопределенные операторы == и >


Нет, только
copy constructor и operator = .

Цитата:

Requirements for Container Elements
Elements inserted into an STL container can be of any object type that supplies a public copy constructor, a public destructor, and a public assignment operator. The destructor may not throw an exception. Furthermore, associative containers such as set and map must have a public comparison operator defined, which is operator< by default. Some operations on containers might also require a public default constructor and a public equivalence operator.
...
Рейтинг: 0 / 0
вопрос об STL
    #34013908
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще,
Код: plaintext
1.
std::vector< std::vector< int > > myarray;

чем не подходит ?
...
Рейтинг: 0 / 0
вопрос об STL
    #34013947
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv --null--Насколько я помню, тип, хранящийся в векторе должен иметь переопределенные операторы == и >


Нет, только
copy constructor и operator = .

Цитата:

Requirements for Container Elements
Elements inserted into an STL container can be of any object type that supplies a public copy constructor, a public destructor, and a public assignment operator. The destructor may not throw an exception. Furthermore, associative containers such as set and map must have a public comparison operator defined, which is operator< by default. Some operations on containers might also require a public default constructor and a public equivalence operator.

Странно.
Как минимум это зависит от версии.
Дело в том что я STL изучал на примере не очень современного для нынешнего времени компилятора Visual C++ 5.0 и он там требовал переопределения operator< для члена вектора. По ошибке можно было дойти до недр STL, где он применялся (if(*_F1 < *_F2) и так делее)
Т.е. в ряде версий STL это точно требуется.

И у какого-то автора (по-моему в "Эффективном использовании STL" было напиисан что мол STL требует эти операторы для реализации итераторов произвольного доступа, которые как раз предоставляет vector (и deque).
Требуется == и <, а остальные операторы сравнения она на их основе сама достраивает.
...
Рейтинг: 0 / 0
вопрос об STL
    #34014152
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не может быть такого. Вектору-то нафига что-то сравнивать ?
...
Рейтинг: 0 / 0
вопрос об STL
    #34014165
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для реализации самого вектора казалось бы ни к чему

Но imho необходимость появляется, когда выходят на свет итераторы произвольного доступа. Для них необходимо перепоределение >
Они используются например в алгоритме sort

sort(v.begin(),v.end());

как бы эта форма работала без итераторов произвольного доступа и без возможности сравнивания (>) элементов вектора?

Получается когда мы создаем вектор по шаблону - итератор уже должен быть и уметь что-то там сравнивать, следовательно операторы должны быть определены к моменту объявления вектора. Я так думаю.
...
Рейтинг: 0 / 0
вопрос об STL
    #34014168
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, именно поэтому sort не умеет работать с list-ом - тот по своей природе не предоставляет итераторов произвольного доступа и поэтому list имеет свой встроенный медленный sort, который работает на двунаправленных итераторах.
...
Рейтинг: 0 / 0
вопрос об STL
    #34014244
--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--Для реализации самого вектора казалось бы ни к чему

Но imho необходимость появляется, когда выходят на свет итераторы произвольного доступа. Для них необходимо перепоределение >
Они используются например в алгоритме sort

sort(v.begin(),v.end());

как бы эта форма работала без итераторов произвольного доступа и без возможности сравнивания (>) элементов вектора?

Получается когда мы создаем вектор по шаблону - итератор уже должен быть и уметь что-то там сравнивать, следовательно операторы должны быть определены к моменту объявления вектора. Я так думаю.

Не получается. Любому итератору глубоко пофиг поддерживается типом операция < или нет. Контейнеру, если он ассоциативный, нужно. Алгоритму - если это sort или, например, binary_search тоже нужно. Но не итератору. И то можно обойтись функтором типа less<T>.
Итератор предоставляет доступ к элементу, он значения типов не сравнивает.

Контейнеры не зависят от реализаций внешних алгоритмов. sort не может накладывать ограничения на vector и его итераторы.
...
Рейтинг: 0 / 0
вопрос об STL
    #34014439
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм. А как же будет работать sort если нельзя сравнивать элементы контейнера?
...
Рейтинг: 0 / 0
вопрос об STL
    #34014455
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Требования итератора произвольного доступа

Да и во многих статьях и книгах об этом же сказано.
Что итераторы произвольного доступа требуют переопределения оператора < и других операторов сравнения.
Если же все эти книги -статью неправильны - я в принципе готов предать их анафеме, хотя довольно странно.
...
Рейтинг: 0 / 0
вопрос об STL
    #34014708
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Книжки выкидывать не к чему, они правильные. Для итераторов произвольного доступа действительно нужны операторы сравнения, только не надо их путать с comparator'ом с помощью которого сравниваются элементы контейнера, по умолчанию это less который использует оператор <. но можно любой свой закатаь.
...
Рейтинг: 0 / 0
вопрос об STL
    #34014728
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен. Comparator сравнивает элементы, а < в итераторах сравнивает позиции. Просто я немного неправильно выразился. Но < все равно нужен :-)
...
Рейтинг: 0 / 0
вопрос об STL
    #34016953
ZeusTheTryuGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вся инициализация делается так
Код: plaintext
1.
2.
3.
4.
5.
vector<vector<int> > my_vector( 9 );
(for int i =  0 ; i < my_vector.size(); i++)
{
 my_vector[i].resize( 9 );
}

После этого можно обращаться к my_vector как к двумерному массиву
Все посты выше похожи на извращения
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос об STL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]