具有来自多个类的值的 C++ std::vector

Posted

技术标签:

【中文标题】具有来自多个类的值的 C++ std::vector【英文标题】:C++ std::vector with values from multiple classes 【发布时间】:2021-02-14 18:51:19 【问题描述】:

我使用std::vector 将我的值从我的课程AB 存储到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;

然后,在不更改 AB 类的定义的情况下,您可以插入 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的主要内容,如果未能解决你的问题,请参考以下文章

具有来自 db 函数的值的 DbDataAdapter

如何将来自先前类的值存储到 C++ 中的向量中?

具有来自 .tfvars 的值的 terraform for_each 实现

如何使用 jquery 创建具有来自动态创建的表单字段的值的多维数组?

Swift:检查来自同一类的 2 个对象是不是具有不同的值?

Spark和Scala,通过映射公用键添加具有来自另一个数据帧的值的新列[重复]