Здравствуйте, Аноним, Вы писали:
А>В чем ошибка?
А>std::vector<std::vector<double> > a(n,n+1);
Не очень понимаю, что ты тут пытаешься сделать.. Само объявление вектора векторов будет работать:
std::vector<std::vector<double> > a;
Это должно скомпилироваться без проблем. Т.е. ошибка не в объявлении, ошибка в инициализации. Так как остального кода нет — то мне не понятно, что именно ты тут пытаешься сделать. Чтобы инициализировать вектор векторов — n тоже должен иметь тип вектора векторов.
Только это.. ты б хоть указатели на векторы хранил, а не сами векторы. Например, так:
std::vector<std::vector<double> *> a;
С уважением, Artem Korneev.
Re[2]: c++4.3 и вектор от вектора
От:
Аноним
Дата:
13.01.09 20:39
Оценка:
Здравствуйте, artem_korneev, Вы писали:
_>Не очень понимаю, что ты тут пытаешься сделать..
Конретизирую вопрос. Как лечить и в чем проблема этой проги?
$ cat test.cc
#include <vector>
#define n 100
main(){
std::vector<std::vector<double> > a(n,n+1);
}
$ c++ test.cc
/usr/include/c++/4.3/bits/stl_vector.h: In member function ‘void std::vector<_Tp, _Alloc>::_M_initialize_dispatch(_Integer, _Integer, std::__true_type) [with _Integer = int, _Tp = std::vector<double, std::allocator<double> >, _Alloc = std::allocator<std::vector<double, std::allocator<double> > >]’:
/usr/include/c++/4.3/bits/stl_vector.h:290: instantiated from ‘std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = int, _Tp = std::vector<double, std::allocator<double> >, _Alloc = std::allocator<std::vector<double, std::allocator<double> > >]’
test.cc:4: instantiated from here
/usr/include/c++/4.3/bits/stl_vector.h:932: ошибка: нет подходящей функции для вызова ‘std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::_M_fill_initialize(size_t, int&)’
/usr/include/c++/4.3/bits/stl_vector.h:974: замечание: претенденты: void std::vector<_Tp, _Alloc>::_M_fill_initialize(size_t, const _Tp&) [with _Tp = std::vector<double, std::allocator<double> >, _Alloc = std::allocator<std::vector<double, std::allocator<double> > >]
Здравствуйте, artem_korneev, Вы писали:
_>Только это.. ты б хоть указатели на векторы хранил, а не сами векторы. Например, так:
_>std::vector<std::vector<double> *> a;
Ну это ты зря. Не забывай, что сам по себе std::vector — это малюсенькая структурка, инкапсулирующая два указателя (в типовой реализаци). Кроме того гарантирующая автоматическое выделение и освобождение памяти. Ты же предлагаешь необоснованное введение дополнительной косвенности для обращения к этим маленьким структуркам, плюс заботу о самостоятельном выделении и освобождении памяти.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, artem_korneev, Вы писали:
_>>Не очень понимаю, что ты тут пытаешься сделать..
А>Конретизирую вопрос. Как лечить и в чем проблема этой проги? А>[code] А>#include <vector> А>#define n 100 А>int main() А>{ А> std::vector<std::vector<double> > a(n,n+1); А>}
Одно из двух — либо компилятор, либо используемая стандартная библиотека C++ не соответствуют стандарту. Этот пример после добавления типа возвращаемого значения функции main должен компилироваться без ошибок.
--
Справедливость выше закона. А человечность выше справедливости.
Re[4]: c++4.3 и вектор от вектора
От:
Аноним
Дата:
13.01.09 20:57
Оценка:
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, artem_korneev, Вы писали:
_>>>Не очень понимаю, что ты тут пытаешься сделать..
А>>Конретизирую вопрос. Как лечить и в чем проблема этой проги? А>>[code] А>>#include <vector> А>>#define n 100 А>>int main() А>>{ А>> std::vector<std::vector<double> > a(n,n+1); А>>}
R>Одно из двух — либо компилятор, либо используемая стандартная библиотека C++ не соответствуют стандарту. Этот пример после добавления типа возвращаемого значения функции main должен компилироваться без ошибок.
так после установки обновлений появилась ошибка, т.е. новый компилятор с глюками ...
Как бы подправить код с вектором от вектора, чтобы не переделывать всю программу?
Здравствуйте, Аноним, Вы писали:
А>так после установки обновлений появилась ошибка, т.е. новый компилятор с глюками ... А>Как бы подправить код с вектором от вектора, чтобы не переделывать всю программу?
Сочувствую. В борьбе с кривым компилятором самый испытанный метод — метод научного тыка.
P.S. А для задания константы n вместо макроса лучше использовать просто целочисленную константу. Об этом ОЧЕНЬ много всего написано, в т.ч. и на этом форуме.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Аноним, Вы писали:
А>В чем ошибка?
А>строка 123: А>
А>std::vector<std::vector<double> > a(n,n+1);
А>
Интересный вопрос, спасибо.
Насколько я понимаю, приведенная конструкция должна создать матрицу размером n x n+1. Многие реализации STL действительно позволяют так сделать. Посмотрим, благодаря чему это происходит.
Из четырех описаных стандартом конструкторов вектора (23.2.4.1) для создания матрицы a выбирается конструктор
или его аналог, предоставленный конкретной реализацией. Кстати в исходном примере также выбирается этот конструктор — это видно из сообщения об ошибке:
Выделенные места — это дополнительная проверка на интегральность типа InputIterator, и выбор специальной версии функции _M_initialize_aux в случае, исли _InputIterator является интегральным типом (что и происходит в нашем примере).
Стандартом эта проверка никак не оговаривается, а значит реализация не обязана ее делать, хотя многие делают. Я смог получить ошибку компиляции только на VC7.1 с DinkumSTL. С STLPort все работает, как и ожидалось.
ЗЫ
До этого вопроса я не знал о такой возможности, и всегда использовал вот такую конструкцию:
Здравствуйте, rg45, Вы писали:
R>Ну это ты зря. Не забывай, что сам по себе std::vector — это малюсенькая структурка, инкапсулирующая два указателя (в типовой реализаци).
Не поделишься примером такой реализации? Я до сих пор встречал реализации с тремя указателями...