在 C++ 中设置向量
Posted
技术标签:
【中文标题】在 C++ 中设置向量【英文标题】:Setting up a vector in C++ 【发布时间】:2013-04-24 17:30:07 【问题描述】:我正在尝试设置一个向量来存储一组棒球投手。我想存储一个投手的名字 Joe Smith(字符串)和他过去两年的平均得分 - 2.44 和 3.68。我还想存储第二个投手的名字 - Bob Jones(字符串)和他的平均得分 5.22 和 4.78。这是一个更大的家庭作业的一部分,但我才刚刚开始使用向量。我遇到的问题是我的教科书说向量只能用于存储相同类型的值,而我发现的所有示例都主要使用整数值。例如我在 cplusplus.com 上找到了这个例子
// constructing vectors
#include <iostream>
#include <vector>
int main ()
unsigned int i;
// constructors used in the same order as described above:
std::vector<int> first; // empty vector of ints
std::vector<int> second (4,100); // four ints with value 100
std::vector<int> third (second.begin(),second.end()); // iterating through second
std::vector<int> fourth (third); // a copy of third
// the iterator constructor can also be used to construct from arrays:
int myints[] = 16,2,77,29;
std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );
std::cout << "The contents of fifth are:";
for (std::vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
有什么办法可以改变这个代码来接受一个字符串和两个双精度数?我不需要从用户那里得到任何输入,我只需要在 int main() 中初始化两个投手。我已经为他们设置了一个类,如下所示,但分配需要一个向量。
#ifndef PITCHER_H
#define PITCHER_H
#include <string>
using namespace std;
class Pitcher
private:
string _name;
double _ERA1;
double _ERA2;
public:
Pitcher();
Pitcher(string, double, double);
~Pitcher();
void SetName(string);
void SetERA1(double);
void SetERA2(double);
string GetName();
double GetERA1();
double GetERA2();
;
#endif
#include "Pitcher.h"
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
Pitcher::Pitcher()
Pitcher::Pitcher(string name, double ERA1, double ERA2)
_name = name;
_ERA1 = ERA1;
_ERA2 = ERA2;
Pitcher::~Pitcher()
void Pitcher::SetName(string name)
_name = name;
void Pitcher::SetERA1(double ERA1)
_ERA1 = ERA1;
void Pitcher::SetERA2(double ERA2)
_ERA2 = ERA2;
string Pitcher::GetName()
return _name;
double Pitcher::GetERA1()
return _ERA1;
double Pitcher::GetERA2()
return _ERA2;
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include "Pitcher.h"
using namespace std;
int main()
Pitcher Pitcher1("Joe Smith", 2.44, 3.68);
cout << Pitcher1.GetName() << endl;
cout << Pitcher1.GetERA1() << endl;
cout << Pitcher1.GetERA2() << endl;
system("PAUSE");
return 0;
【问题讨论】:
【参考方案1】:我想你想存储一个投手向量
vector<Pitcher> pitchers;
Pitcher p1("name", 0.5, 0.1); //create a pitcher
pitchers.push_back(p1); //add the pitcher to the vector
...//fill in some other pitchers
//to print all the pitchers
for(unsigned i = 0; i < pitchers.size(); ++i)
cout << pitchers[i].GetName() << " " << pitchers[i].GetERA1() << "\n";
希望这个例子能解决一些问题。
【讨论】:
这种方法比我的好,你不使用指针,只是要记住,如果你想在作用域结束后保持它的活动,你需要一个指针。 @demonofnight Pitcher 对象将被复制到向量中,因此它们的范围将与向量的范围相同。例如,如果返回向量,它将包含有效的 Pitcher 对象。 @Porkbutts 更重要的是:鉴于Pitcher
的定义,您可能永远不应该有指向它的指针。您可以使用[]
(或迭代器,或back()
或front()
)在向量中访问它。如果您想保留在本地,请复制一份。
我没有使用指针,你是对的,我只需要一个投手向量,这是一个巨大的帮助。【参考方案2】:
你想要类似的东西
vector<Pitcher*> *vecPit=new vector<Pitcher*>();
你添加
vecPit->push_back(new Pitcher("string", 2.123, 2.123)
【讨论】:
如果你想要这种类型的东西 - 使用智能指针,而不是原始指针。例如。vector<shared_ptr<Pitcher> > vecPit;
加上vecPit.push_back(make_shared<Pitcher>("string", 1,2));
这样你就不用担心删除包含的对象了。
push_back 后如何使用新投手?只是好奇,因为我自己在学校学习 C++。在连续阅读了大约 3 天试图沉浸在所有内容之后,我已经完成了我们在课堂上阅读的书。我只记得向量很好,因为它们没有固定的大小。 @demonofnight
@gbjbaanb 更具体地说:你不想要这种东西。智能指针是一种变通方法,但任何类型的指针都是设计错误。写得好的 C++ 尽可能使用值语义。
@CharlesAddis vecPit->at(pos)->SetName("asdasd");你有 vecPit->size() 或者你可以使用迭代器
同意詹姆斯。由于向量由数组支持,因此您可以获得空间局部性的额外好处。使用投手对象而不是指向投手的指针。指向向量的指针很好,但我更愿意通过成员变量保留对实际向量的引用。以上是关于在 C++ 中设置向量的主要内容,如果未能解决你的问题,请参考以下文章