【问题标题】:C++ std::vector with values from multiple classes具有来自多个类的值的 C++ std::vector
【发布时间】: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。

标签: c++ class vector


【解决方案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 }
    

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2013-05-07
      • 2014-02-12
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多