具有来自多个类的值的 C++ std::vector
Posted
技术标签:
【中文标题】具有来自多个类的值的 C++ std::vector【英文标题】:C++ std::vector with values from multiple classes 【发布时间】:2021-02-14 18:51:19 【问题描述】:我使用std::vector
将我的值从我的课程A
和B
存储到MyValues
。插入的元素/值取决于类的类型。如果是A
,则插入x, y
,如果是B
,则插入x, y, z
。我循环它,所以我可以尝试添加它的多个值,来测试它。但是当我循环A.ases
5 次然后B.bses
7 次时,循环的 MyValues 出于某种原因有 31 个单个元素。可以添加元素和“保留表单”(如果是 A
-> x, y
,如果是 B
,-> x, y, z
),所以我可以获得相同的值,就像我插入的值一样并使用它?
类:
std::vector<int> MyValues;
class A
public:
short int x, y;
A()
this->x = this->y = 0;
;
class B : public A
public:
short int z;
B()
this->z = 0;
;
主要:
int main()
A ases[5];
B bses[7];
for (short int a = 0; a < 5; a++)
ases[a].x = 5 + a;
ases[a].y = 4 + a;
MyValues.insert(MyValues.end(), ases[a].x, ases[a].y );
for (short int b = 0; b < 7; b++)
bses[b].x = 2 + b;
bses[b].y = 3 + b;
bses[b].z = 1 + b;
MyValues.insert(MyValues.end(), bses[b].x, bses[b].y, bses[b].z );
for (int v : MyValues) std::cout << "x y z = " << v << std::endl;
return 0;
输出:
x y z = 5
x y z = 4
x y z = 6
x y z = 5
x y z = 7
x y z = 6
x y z = 8
x y z = 7
x y z = 9
x y z = 8
x y z = 2
x y z = 3
x y z = 1
x y z = 3
x y z = 4
x y z = 2
x y z = 4
x y z = 5
x y z = 3
x y z = 5
x y z = 6
x y z = 4
x y z = 6
x y z = 7
x y z = 5
x y z = 7
x y z = 8
x y z = 6
x y z = 8
x y z = 9
x y z = 7
【问题讨论】:
你使用的是什么 C++ 版本? 您几乎可以肯定必须创建一个可以保存数据的对象并创建这些数据的向量。 @TonyTannous 不确定,如何找到它,但 Visual Studio 只显示 C++ 2019。 @TonyTannous 你能做一个输出操作符来为 A 和 B 做正确的事情吗? @TonyTannous 道歉,我是想@ OP。 【参考方案1】:如果您使用的是 Visual Studio 2019,那么您应该能够打开 C++17。此演示使用std::optional。不知道效率如何,但很方便。
#include <iostream>
#include <vector>
#include <optional>
struct Base
int x, y;
std::optional<int> z;
Base(int _x, int _y) :
x(_x),
y(_y)
Base(int _x, int _y, int _z) :
x(_x),
y(_y),
z(_z)
;
int main()
Base b1 1, 2, 3;
Base b2 4, 5;
Base b3 9, 9, 9;
std::vector V b1, b2, b3;
for (auto& item : V)
std::cout << item.x << " " << item.y << " ";
if (item.z.has_value())
std::cout << item.z.value();
std::cout << std::endl;
对于演示:https://godbolt.org/z/nbedjb
【讨论】:
【参考方案2】:您可以将MyValues
设为向量的向量,如下所示:
std::vector<std::vector<int>> MyValues;
然后,在不更改 A
和 B
类的定义的情况下,您可以插入 2 或 3 元素向量,使用与 main
函数中已有的代码大致相同的代码。您只需要更改显示数据的方式;我在下面的代码中展示了一种方式,但还有很多其他方式,具体取决于您希望输出的“漂亮”程度。
int main()
A ases[5];
B bses[7];
for (short int a = 0; a < 5; a++)
ases[a].x = 5 + a;
ases[a].y = 4 + a;
MyValues.insert(MyValues.end(), ases[a].x, ases[a].y );
for (short int b = 0; b < 7; b++)
bses[b].x = 2 + b;
bses[b].y = 3 + b;
bses[b].z = 1 + b;
MyValues.insert(MyValues.end(), bses[b].x, bses[b].y, bses[b].z );
// No change required up to here; just change the code for output...
for (auto v : MyValues)
std::cout << " ";
bool first = true;
for (auto i : v)
if (!first) std::cout << ", ";
std::cout << i;
first = false;
std::cout << " " << std::endl;
return 0;
上面的输出:
5, 4
6, 5
7, 6
8, 7
9, 8
2, 3, 1
3, 4, 2
4, 5, 3
5, 6, 4
6, 7, 5
7, 8, 6
8, 9, 7
【讨论】:
以上是关于具有来自多个类的值的 C++ std::vector的主要内容,如果未能解决你的问题,请参考以下文章
具有来自 .tfvars 的值的 terraform for_each 实现
如何使用 jquery 创建具有来自动态创建的表单字段的值的多维数组?