Реализация печати завершается неудачно сразу после pushback (вектор) - PullRequest
0 голосов
/ 02 марта 2019

Я новичок в C ++ и векторах, и поэтому я столкнулся с некоторыми проблемами, связанными с этой функцией, которая не печатает нужные значения после возврата назад.Я получаю то, что я считаю значениями мусора.Может ли это быть из-за того, что я работаю с неподписанным символом, а не с целочисленными типами?Я не знаю.Мне нужно заставить его работать для моего школьного задания, которое должно скоро произойти, и я действительно застрял в этом.Может ли кто-нибудь здесь быть в состоянии решить эту проблему?Спасибо!

Желаемый вывод:

********** TestSubscript1 **********
Construct from unsigned char array:
2  4  6  6  8  10  6  12  234  14  16  6  6  (size=13, capacity=16)

Мой вывод:

********** TestSubscript1 **********
Construct from unsigned char array:

  ê     (size=13 capacity=16)

Заголовочный файл (Моя реализация):

template <typename T>
vec 
{

private:
T* v;
int count;
int capacity;
public:

vector(){
    capacity=0;
    v = nullptr;
    count = 0;
}
void push_back(const T& t)
{
    if(count+1>capacity)
{
    capacity = std::max(2*capacity, 1);

    T* newData = new T[capacity];
    for(int i=0; i <count; i++)
    {
        newData[i] = v[i];
    }
    delete[] v;
    v = newData;
}
v[count++] = t;
}
T& operator[](size_t num) const
{   
    return v[num];
}

template <typename T1>

friend void Print(const vector<T1>& s);

};
template <typename T1>
void Print(const vector<T1>& s)
{
    for(int i = 0; i < s.count; i++) 
    {
    std::cout<<s.v[i]<<" ";
    }
    std::cout<< "(size=" << s.count << " " << "capacity=" << s.capacity << 
 ")";
    std::cout<<std::endl; 
    }

основной файл(Остается без изменений):

#include <iostream>
#include <cstdlib>              // atoi
#include "cs150_vect.h"

void TestSubscript1(void)
{
std::cout << "\n********** TestSubscript1 **********\n";
unsigned char ia[] = { 2, 4, 6, 6, 8, 10,
                       6, 12, 234, 14, 16, 6, 6
                     };
int size = sizeof(ia) / sizeof(*ia);
std::cout << "Construct from unsigned char array:\n";
cs150::vector<unsigned char> temp_vec;
for(int i=0; i<size; ++i)
    temp_vec.push_back(ia[i]);

const cs150::vector<unsigned char> a(temp_vec);
Print(a);
}

1 Ответ

0 голосов
/ 02 марта 2019

Да, это потому, что вы работаете с данными char.operator<< имеет перегрузки для char и unsigned char, которые печатают эти значения в виде символов, а не цифр.Поскольку вы хотите, чтобы числа просто переключались на int с unsigned char.

int ia[] = { 2, 4, 6, 6, 8, 10,
                       6, 12, 234, 14, 16, 6, 6
                     };
int size = sizeof(ia) / sizeof(*ia);
std::cout << "Construct from int array:\n";
cs150::vector<int> temp_vec;

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

Если вы действительноЕсли вы хотите придерживаться данных char, то одним из способов было бы написать специализацию вашей функции Print для unsigned char, чтобы она печатала символы в виде чисел.

template <>
inline void Print(const vector<unsigned char>& s)
{
    for(int i = 0; i < s.count; i++) 
    {
        std::cout<<(unsigned)s.v[i]<<" "; // print chars as numbers
    }
    std::cout<< "(size=" << s.count << " " << "capacity=" << s.capacity << ")";
    std::cout<<std::endl; 
}

Эта специализация в дополнение куниверсальная версия.Он говорит, что когда T равен unsigned char, используйте эту версию вместо универсальной версии.

Не совсем уверен, нужно ли вам объявить эту версию в качестве друга или нет.Без сомнения, вы узнаете это.

...