Re[2]: c++4.3 и вектор от вектора
От: rg45 СССР  
Дата: 13.01.09 20:43
Оценка: +2
Здравствуйте, artem_korneev, Вы писали:

_>Только это.. ты б хоть указатели на векторы хранил, а не сами векторы. Например, так:


_>std::vector<std::vector<double> *> a;


Ну это ты зря. Не забывай, что сам по себе std::vector — это малюсенькая структурка, инкапсулирующая два указателя (в типовой реализаци). Кроме того гарантирующая автоматическое выделение и освобождение памяти. Ты же предлагаешь необоснованное введение дополнительной косвенности для обращения к этим маленьким структуркам, плюс заботу о самостоятельном выделении и освобождении памяти.
--
Справедливость выше закона. А человечность выше справедливости.
c++4.3 и вектор от вектора
От: Аноним  
Дата: 13.01.09 19:15
Оценка: 9 (1)
В чем ошибка?

строка 123:
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:123:   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> > >]
Re: c++4.3 и вектор от вектора
От: Bell Россия  
Дата: 14.01.09 04:53
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>В чем ошибка?


А>строка 123:

А>
А>std::vector<std::vector<double> > a(n,n+1);
А>


Интересный вопрос, спасибо.
Насколько я понимаю, приведенная конструкция должна создать матрицу размером n x n+1. Многие реализации STL действительно позволяют так сделать. Посмотрим, благодаря чему это происходит.
Из четырех описаных стандартом конструкторов вектора (23.2.4.1) для создания матрицы a выбирается конструктор
template <class InputIterator>
vector(InputIterator first, InputIterator last,
       const Allocator& = Allocator());

или его аналог, предоставленный конкретной реализацией. Кстати в исходном примере также выбирается этот конструктор — это видно из сообщения об ошибке:

/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> > >]’


Далее для определенности рассмотрим STLPort 5.2.1, там описываемый конструктор имеет следующий вид:
template <class _InputIterator>
  vector(_InputIterator __first, _InputIterator __last,
               const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL )
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__a) {
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
    _M_initialize_aux(__first, __last, _Integral());
  }

Выделенные места — это дополнительная проверка на интегральность типа InputIterator, и выбор специальной версии функции _M_initialize_aux в случае, исли _InputIterator является интегральным типом (что и происходит в нашем примере).
Стандартом эта проверка никак не оговаривается, а значит реализация не обязана ее делать, хотя многие делают. Я смог получить ошибку компиляции только на VC7.1 с DinkumSTL. С STLPort все работает, как и ожидалось.

ЗЫ
До этого вопроса я не знал о такой возможности, и всегда использовал вот такую конструкцию:
std::vector<std::vector<double> > a(n,std::vector<double>(n+1));

Конечно не так красиво, зато стандартно . В твоем случае это должно помочь.
Любите книгу — источник знаний (с) М.Горький
Re[3]: c++4.3 и вектор от вектора
От: Bell Россия  
Дата: 14.01.09 04:55
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Ну это ты зря. Не забывай, что сам по себе std::vector — это малюсенькая структурка, инкапсулирующая два указателя (в типовой реализаци).

Не поделишься примером такой реализации? Я до сих пор встречал реализации с тремя указателями...
Любите книгу — источник знаний (с) М.Горький
Re: c++4.3 и вектор от вектора
От: artem_korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 13.01.09 20:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В чем ошибка?


А>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> > >]
Re[3]: c++4.3 и вектор от вектора
От: rg45 СССР  
Дата: 13.01.09 20:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 должен компилироваться без ошибок.


так после установки обновлений появилась ошибка, т.е. новый компилятор с глюками ...

Как бы подправить код с вектором от вектора, чтобы не переделывать всю программу?
Re[5]: c++4.3 и вектор от вектора
От: rg45 СССР  
Дата: 13.01.09 21:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>так после установки обновлений появилась ошибка, т.е. новый компилятор с глюками ...

А>Как бы подправить код с вектором от вектора, чтобы не переделывать всю программу?

Сочувствую. В борьбе с кривым компилятором самый испытанный метод — метод научного тыка.

Попробуй, например, так:
std::vector<double> row_template(n+1);
std::vector<std::vector<double> > a(n, row_template);


P.S. А для задания константы n вместо макроса лучше использовать просто целочисленную константу. Об этом ОЧЕНЬ много всего написано, в т.ч. и на этом форуме.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.