gpt4 book ai didi

c++ - 尝试使用模板制作 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:22 25 4
gpt4 key购买 nike

我正在尝试自学 C++,但我又一次被困在某些事情上,似乎无法修复它。请原谅您即将看到的代码的可怕困惑。这也是我在这个网站上的第一篇文章,所以文章的格式可能也会被取消,抱歉。

有两个文件:main.cpp和vect1.h(没有 vect1.cpp,因为模板似乎只存在于头文件中)


主要.cpp:

#include <iostream>
#include "vect1.H"

using namespace std;

int main(){
vect1<int> inst1(10);
inst1[9]=4;
cout<<inst1[9]<<endl;
//-----
vect1<double> inst2(10);
inst2[5]=5.112;
cout<<inst2[5]<<endl;
//-----

//====PART 2=====//
cout<<"--------"<<endl;
inst2[9]=999;
cout<<inst2[9]<<endl;
//inst2.pop();
inst2.push(2);
cout<<inst2[9]<<endl;
cout<<inst2[10]<<endl;//New block
system("PAUSE");
return 0;}

vect1.h:

#ifndef VECT1_H
#define VECT1_H
#include <iostream> //DEBUG
template <class T>
class vect1{
private:
T *ptr;
T total; //work on this
int units;
int counter;
public:
//vect1();
vect1(T);
vect1();
T &operator[](const int &);
void pop();
void push(T);

};
//---------------------

/*
template <class T>
vect1<T>::vect1(){
ptr = new int [0];
}
*/

template <class T>
vect1<T>::vect1(T number){
ptr = new T [number];
total=0;
units=(int)number;
for(counter=0;counter<number;counter++){
ptr[counter]=0;
}
}
/* now the destruct is giving me errors...
template <class T>
vect1<T>::~vect1(){
total=0;
delete[] ptr;
}*/ //<<this line tosses a C2039 error

template <class T>
T &vect1<T>::operator[](const int & ref){
if(ref>0 && ref<(units)){
return ptr[ref];
}else{
throw "Error! Out of range!"; //<<make catch
}
}
//--------
template <class T>
void vect1<T>::pop(){
units = (units-1);
T *tempPtr;
tempPtr = new T[units];
for(counter=0;counter<units;counter++){
tempPtr[counter]=ptr[counter];
}
delete[] ptr;
ptr = new T[units];
for(counter=0;counter<units;counter++){
ptr[counter]=tempPtr[counter];
}
delete[] tempPtr;
}
//--
template <class T>
void vect1<T>::push(T pushnum){
units++;
const int newsize=(int)units; //<<<<<
T *tempPtr;
tempPtr = new T[units];
for(counter=0;counter<(units-1);counter++){
tempPtr[counter]=ptr[counter];
}
//tempPtr[(int)units]=pushnum;
delete[] ptr;
std::cout<<units<<std::endl;//<<DEBUG
ptr = new T[units];
for(counter=0;counter<(units-1);counter++){
ptr[counter]=tempPtr[counter];
//ptr[9]=101;
}
ptr[newsize]=pushnum; /* <<bleh */
//ptr[newsize]=12321; //DEBUG //<<Even this isn't working...
delete[] tempPtr;
}
//---------------------
#endif

输出(在控制台):

4
5.112
--------
999
11
999
-6.27744e+066
Press any key to continue . . .

计划是这样当你 pop() 它会创建一个新的临时数组 T 并将除最后一个 block 之外的所有内容从原始数组复制到临时数组,删除原始数组,然后创建一个新数组比以前小一个尺寸,然后将所有内容发回,删除临时数组。 push(number) 的想法相同,只是相反。 Push 会将自己复制到 temp,push 会删除自己,然后将自己重新创建为大 1 大小,然后将所有内容从 temp 发送到 push 并删除 temp。然后将 push 发送的号码发送到新 block 中。所以这个程序应该在第二个“999”行之后打印出“2”。但我得到的是“-6.27744e+066”。

Pop() 似乎有效。排序。但是 push(num) 确实存在问题。我的析构函数似乎也突然出现 C2039 错误。它以前没有这样做,而且我还没有更改其中的任何内容。

如果有人能检查一下这个烂摊子并给我一些修复建议,我将不胜感激。谢谢!

我使用 Visual Studio 2010 作为我的编译器。

这是我的构建日志(带有一些不错的错误/警告!):

1>------ Rebuild All started: Project: chapter 16-5, Configuration: Debug Win32 ------
1>Build started 2/9/2012 5:34:01 PM.
1>_PrepareForClean:
1> Deleting file "Debug\chapter 16-5.lastbuildstate".
1>InitializeBuildStatus:
1> Creating "Debug\chapter 16-5.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1> main.cpp
1>e:\programming(cpp)\chapter 16-5\chapter 16-5\vect1.h(31): warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data
1> e:\programming(cpp)\chapter 16-5\chapter 16-5\vect1.h(30) : while compiling class template member function 'vect1<T>::vect1(T)'
1> with
1> [
1> T=double
1> ]
1> e:\programming(cpp)\chapter 16-5\chapter 16-5\main.cpp(11) : see reference to class template instantiation 'vect1<T>' being compiled
1> with
1> [
1> T=double
1> ]
1>Manifest:
1> Deleting file "Debug\chapter 16-5.exe.embed.manifest".
1>LinkEmbedManifest:
1> chapter 16-5.vcxproj -> E:\Programming(CPP)\chapter 16-5\Debug\chapter 16-5.exe
1>FinalizeBuildStatus:
1> Deleting file "Debug\chapter 16-5.unsuccessfulbuild".
1> Touching "Debug\chapter 16-5.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:10.62
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

最佳答案

template <class T>
vect1<T>::vect1(T number){
ptr = new T [number];
total=0;
units=(int)number;
for(counter=0; counter<number; counter++) {
ptr[counter]=0;
}
}

此构造函数为 number 对象分配空间,但 number 具有通用类型 T,您将其转换为 int。如果你想要一个字符串或对象的 vector ,转换为 int 会失败。 number 应该是 int 类型。通常不需要强制转换,它可能是糟糕设计的征兆(除了继承 - dynamic_cast)。

因为 T 可以是任何你不能在构造函数中初始化它的东西,你必须把它留给你的 vector 的用户。


T &vect1<T>::operator[](const int & ref){

您使用 const 引用是因为您可能被告知它比按值传递更快。好吧,这适用于较大的对象,而不适用于 int。引用基本上只是另一个指针(具有不同的语法)。该函数将一个地址传递给目标变量。指针和 int 通常一样大,所以这里没有改进,通过指针访问肯定比直接访问值慢。


template <class T>
void vect1<T>::pop(){
units = units-1;
T *tempPtr = new T[units];
for(counter=0;counter<units;counter++){
tempPtr[counter]=ptr[counter];
}
delete[] ptr;
ptr = tempPtr;
}

无需将数据复制回ptr,复制指针即可。


template <class T>
void vect1<T>::push(T pushnum){
units++;
T *tempPtr = new T[units];
for(counter=0;counter<(units-1);counter++){
tempPtr[counter]=ptr[counter];
}
tempPtr[units-1]=pushnum; // New item is at units-1 position!
delete[] ptr;
ptr=tempPtr; // Again, just assign the pointer.
}

并添加释放分配内存的析构函数。

我希望这对您有所帮助,我很抱歉我的英语不好。

关于c++ - 尝试使用模板制作 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com