@EgorVoziyanov
Batman

Проверка правильности в создание шаблона класса vector?

Задание для лабараторки

Название класса: Вектор и перегружаемая операция << (вывод коллекции в поток вывода). У меня что-то получилось но может вы подскажите что можно исправить или улучшить или свое предложите. И посоветуйте где добавить работу с исключительными ситуацими.

#include <iostream>
  #include <string.h>
  #include <vector>
  #include <typeinfo>
  #include <bits/stream_iterator.h>
 
  using namespace std;
 
  template<class T>
  class MainVector {
   private:
    T *m_ptv;
    int m_size,
        m_index;
   public:
    MainVector() : m_size(0), m_index(0), m_ptv(NULL) { }
    MainVector(int);
    ~MainVector() {
      delete[] m_ptv;
    }
    void addOneElem(const T &);
    T *getVecor();
    int getSizeVector();
  };
  template<class T>
  T *MainVector<T>::getVecor() {
    return m_ptv;
  }
 
  template<class T>
  int MainVector<T>::getSizeVector() {
    return m_size;
  }
 
  template<class T>
  ostream &operator<<(ostream &stream, const vector<T> &values) {
    stream << "[ ";
    copy(begin(values), end(values), ostream_iterator<T>(stream, " "));
    stream << ']';
    return stream;
  }
 
  template<class T>
  MainVector<T>::MainVector(int vectorSize) :
      m_size(vectorSize), m_index(0) {
    m_ptv = new T[m_size];
    const type_info &t = typeid(T);
    const char *azaz = t.name();
    for (int i = 0; i < m_size; i++)
      if (!strcmp(azaz, "char")) *(m_ptv + i) = ' ';
      else *(m_ptv + i) = 0;
  }
 
  template<class T>
  void MainVector<T>::addOneElem(const T &t) {
    T *tmp = NULL;
    if (++m_index >= m_size) {
      tmp = m_ptv;
      m_ptv = new T[m_size + 1];
    }
    if (tmp) memcpy(m_ptv, tmp, sizeof(T) * m_size);
    m_ptv[m_size++] = t;
    if (tmp)
      delete[] tmp;
  }
 
  int main() {
    cout << "Hello, Friday 13!" << endl;
 
    vector<int> vectorOne;
 
    vectorOne.push_back(5);
    vectorOne.push_back(13);
    vectorOne.push_back(666);
 
    cout << "Vector #1 : [";
    for (int i = 0; i < vectorOne.size(); ++i) {
      cout << vectorOne[i] << ' ';
    }
    cout << "]";
 
    cout << endl;
 
    vector<char> vectorTwo;
 
    vectorTwo.push_back('D');
    vectorTwo.push_back('e');
    vectorTwo.push_back('v');
    vectorTwo.push_back('i');
    vectorTwo.push_back('l');
 
    cout << "Vector #2 : [";
    for (int i = 0; i < vectorTwo.size(); ++i) {
      cout << vectorTwo[i] << ' ';
    }
    cout << "]";
 
    cout << endl;
 
    cout << "Using overload ostream: " << endl;
    cout << "Vector #1: " << vectorOne << " and Vector #2: " << vectorTwo;
 
    return 0;
  }
  • Вопрос задан
  • 209 просмотров
Пригласить эксперта
Ответы на вопрос 2
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
ostream &operator<<(ostream &stream, const vector<T> &values) {

Второй параметр функции имеет некорректный тип (должен быть MainVector< T >)

copy(begin(values), end(values), ostream_iterator<T>(stream, " "));

Для того чтобы эта конструкция работала, нужно добавить методы begin(), end() и класс итератора
Но проще сделать через обычный for(int i=0...) stream << val[i] << _delimiter; (лабораторка же).

И посоветуйте где добавить работу с исключительными ситуацими.

Везде, где выделяется память у вас может быть исключительная ситуация bad_alloc. Добавьте сюда MainVector::MainVector(int vectorSize) и сюда void MainVector::addOneElem(const T &t)

И вообще везде, где у вас есть вызов функции, не помеченной throw(), вы должны ловить исключение. У delete[] нет исключений, поэтому в деструкторе обрабатывать исключения не надо.
Ответ написан
@EgorVoziyanov Автор вопроса
Batman
template<class T>
ostream &operator<<(ostream &stream, const MainVector<T> &values) {
  stream << "[ ";
  copy(begin(values), end(values), ostream_iterator<T>(stream, " "));
  stream << ']';
  return stream;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы