将参数添加到该类别一个向量中包含的类中
Add a parameter to a class contained in one vector of that class
我正在做战舰游戏,我需要一些帮助来整理船只。开始了。
我有一个船课:
class Ship {
public:
Ship(char symbol, PositionChar position, char orientation, unsigned int size, unsigned int color);
private:
unsigned int number;
char symbol;
PositionInt position;
char orientation;
unsigned int size;
unsigned int color;
string status;
};
我有一个董事会课程,其中包含:
vector <Ship> ships;
我需要从一个.txt加载信息:
tabuleiro: 10 x 10
1 - Porta-avioes - 5 - P - Vermelho_claro
1 - Fragata - 4 – F - Magenta_claro
2 - Cruzador - 3 - C - Verde_claro
3 - Submarino - 2 - S - Castanho
4 - Lancha - 1 - L - Azul_claro
使用此信息获取信息:
while (getline(config, tmp)) {
config >> nr >> tmp >> nome >> tmp >> size >> tmp >> simb >> tmp >> cor; //de maneira analoga ao tabuleiro faz ignora os espaços e recolhe a info dos navios
if (config.eof())
break;
nr-船只数量Nome-船的名字尺寸 - 尺寸SIMB-代表它的炭COR-颜色
现在,我的问题是。我需要存储所有这些船只(每行都是一艘船)以及向量上的信息。向量中的每个元素将包含我从TXT。
加载的所有信息。我该怎么做?
预先感谢您
最好的问候
我首先要为您的ship
类重载operator>>
:
std::istream &operator>>(std::istream &is, Ship &s) {
std::string tmp;
return is >> s.nr >> tmp
>> s.nome >> tmp
>> s.size >> tmp
>> s.simb >> tmp
>> s.cor;
}
这使您可以直接从文件读取数据到Ship
对象,例如:
std::ifstream in("yourfile.txt");
Ship some_ship;
in >> some_ship;
它也(与其他流提取器一样)返回对您正在阅读的istream
对象的引用。这允许两件事。第一个是链接操作员,因此您可以一次阅读两个(或更多)项目:
in >> ship_a >> ship_b;
这也意味着您可以检查流提取是否成功:
if (in >> some_ship)
// ...
...或在到达文件末尾时(例如)退出的循环阅读:
while (in >> some_ship)
process(some_ship);
标准还包括一种istream_iterator
类型,该类型将使用operator>>
通过迭代器接口读取内容。您可以将其用于(一个示例)读取一个完整的船只对象的文件,并使用它们来初始化向量:
std::ifstream input("YourFilename.txt");
std::vector<Ship> ships { std::istream_iterator<Ship>(input),
std::istream_iterator<Ship>() };
这确实有一个缺点:它隐含地假设一旦您阅读了一个记录的结尾,就会有一些白色空间(空格,标签,纽线等),然后立即将是下一个Ship
对象的记录。如果您的输入文件可能在行末端包含一些额外的垃圾(在船舶对象本身的所有字段之后),则可以在数据行中读取,然后使用stringstream
将对象从该行中解散:
std::string s;
Ship temp;
while (std::getline(input, s)) {
std::istringstream is(s);
if (!is >> temp)
break;
ships.push_back(temp);
}
这使您可以在一条线结束时扔掉任何多余的数据。您一次读取文件一行,然后解析您从该行关心的数据。完成此操作后,您只会忽略剩下的任何东西,然后进入下一行。
直接在此处解决您的关注
ships.push_back(Ship(nr,nome,size,...))
这应该在每艘船的循环中进行。
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为什么一个向量上的多线程操作很慢
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 制作一对共享指针并推送一个向量
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 为什么我们需要在优先级队列声明中添加一个向量作为参数?
- 如何将所有指针从一个向量移动到另一个向量?
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 使用步骤c++构建一个向量
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 将一个向量对放在一个无序映射与一个映射中