我对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);
}
答案 0 :(得分:2)
是的,因为您正在处理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
函数的特殊化,以便将chars打印为数字。
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
时,请使用此版本而不是通用版本。
不完全确定是否需要将此版本声明为朋友。毫无疑问,您会发现这一点。