如何在C ++中创建循环内的结构成员

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中创建循环内的结构成员相关的知识,希望对你有一定的参考价值。

我正在尝试使用C ++中的数据结构来正确组织从循环中收到的一些数据。

我创建了我的结构和我想要的数据。

#include <iostream>
#include <vector>
using namespace std;
#define NumOfProducts 5

struct Product{
    int weight;
    double price;
};

int data1 [5] = { 16, 2, 80, 40, 12070};
int data2 [5] = { 8, 1, 40, 20, 6035};

我想要的是拥有5个“Product”数据结构的成员,每个“weight”从data1中提取,每个“price”从data2中提取。这只是我想要做的事例,因为我的数据集要大得多,所以我认为我真的需要一个for循环而不能手动分配每个案例。

这是我尝试过的。

int main(void){
    Product products[NumOfProducts];
    for (int i=0; i<NumOfProducts; i++){
        products[i].weight = data1[i];
    }
    cout << products[1].weight << endl;
    cout << products << endl;
    return 0;
}

我不确定我得到的结果。

我有5个成员,1个体重,或者我有1个成员,5个体重(作为向量)?我宁愿有5个成员,1个体重,那么我怎样才能改善我的循环?

非常感谢

编辑:似乎我混淆了成员和实例。这段代码看起来更好。

#include <iostream>
#include <vector>
using namespace std;
#define NumOfProducts 5

struct Product{
    int weight;
    double price;
};

vector <int> data1 = { 16, 2, 80, 40, 12070};
vector <int> data2 = { 8, 1, 40, 20, 6035};

int main(void){
    Product products[NumOfProducts];
    for (int i=0; i<NumOfProducts; i++){
        products[i].weight = data1[i];
        products[i].price = data2[i];
    }
    cout << products[1].weight << endl;
    //cout << products << endl; useless as it's the location where the first element of products resides
    return 0;
}
答案

这样的东西将解释如何使用矢量和for循环甚至基于范围的循环与对象默认和用户定义的构造函数:

#include <vector>
#include <iostream>
#include <conio.h> // for _getch()

const unsigned int NumProducts = 5; // Don't like #define I prefer const instead

struct Product {
    int weight;
    float price; // don't need double too much precison & memory consumption

    Product() : weight( 0 ), price( 0.0f ) {}
    Product( int weightIn, float priceIn ) :
        weight( weightIn ),
        price( priceIn ) 
    {}
};

int main() {
    // moved vectors from global; and refrained from "using namespace std" 
    // (bad practice - I prefer to use "std::" so I know what lib they are coming from.
    std::vector<int> weights{ 16, 2, 80, 40, 12070 };
    std::vector<float> prices { 8.0f, 1.0f, 40.0f, 20.0f, 6035.0f };

    // I prefer to use containers "arrays" can be messy. 
    std::vector<Product> products;
    products.reserve( NumProducts ); // 5 Products

    // If Products Are Not Already Created Use 
    // User Defined Constructor & Push Back Into Vector
    for ( unsigned i = 0; i < NumProducts; i++ ) {
        products.push_back( Product( weights[i], prices[i] ) );
    }    
    std::cout << "Output for products vector using Product( int, float ) constructor.
";
    // To access them for printing you don't need & after the auto.
    for ( auto p : products ) {
        std::cout << "Weight = " << p.weight << ", Price = " << p.price << "
";
    }
    std::cout << std::endl;

    // If Default Constructed Products Exist:
    std::vector<Product> products2;
    products2.reserve( NumProducts );
    Product product;
    for ( unsigned i = 0; i < NumProducts; i++ ) {
        products2.push_back( product );
    }

    unsigned i = 0; // counter needed for accessing the elements of the data vectors
    for ( auto& p : products2 ) { // Notice the & after auto; without it all values will still be 0.
        p.weight = weights[i];
        p.price = prices[i];
        i++;
    }    
    std::cout << "Output for products2 vector using Product() constructor adding data after.
";
    // Again don't need the & after p, although it wouldn't hurt if you did use it in this case.
    for ( auto p : products2 ) {
        std::cout << "Weight = " << p.weight << ", Price = " << p.price << "
";
    }
    std::cout << std::endl;

    _getch();
    return 0;
}

我将构造函数添加到Product结构中有两个主要原因:

  • 第一:即使使用默认构造函数;成员将初始化为至少0而不是不确定的值。
  • 第二:用户定义构造允许我通过构造函数创建此对象的实例,以便轻松地将其推回到容器中。

没有构造函数并执行以下操作:

{
    std::vector<Product> products3;
    products3.reserve( NumProducts );
    unsigned idx = 0;
    for ( auto& p : products3 ) {
        p.weight = weights[idx];
        p.price = prices[idx];
        idx++;
    }

    for ( auto& p : products3 ) {
        std::cout << p.weight << ", " << p.price << "
";
    }
    std::cout << std::endl;
}

由于您只保留了内存并且从未向容器添加任何Product实例,因此不会给您任何结果。

另一答案

根据您当前的数据,您的反对意见是什么?

struct Product{
    int weight;
    double price;
} products[]{{16, 8}, {2, 1}, {80, 40}, {40, 20}, {12070, 6035}};

?如果您有大量数据要从文件读入,比如说,那么是时候构建一个构造函数到Product,并使用std::vector<Product> products;进行存储。

Read in from file into structure

另一答案

你有5个qazxsw poi对象,每个对象都有自己独立的qazxsw poi(和Product)成员。

你正在为每个对象初始化weight的方式是要走的路,为price做这个也是你设定的。

请注意,如果您在循环中分配它们之前尝试读取任何成员,则会有未定义的行为,因为weightprice都未初始化。

另一答案

我想要的是拥有5个“Product”数据结构的成员,每个“weight”从data1中提取,每个“price”从data2中提取。

然后写

weight

因此,数组height的每个元素的数据成员int main(void){ Product products[NumOfProducts]; for (int i=0; i<NumOfProducts; i++){ products[i].weight = data1[i]; products[i].price = data2[i]; } //... return 0; } weight用数组priceproducts的元素的相应值初始化。

另一答案

我有5个成员,1个体重,或者我有1个成员,5个体重(作为向量)?

你有一个包含data1类型的5个元素的数组。所有data2实例都有一个Product成员(还有一个你没有初始化的Product成员)。

这只是我想要做的一个例子,因为我的数据集要大得多

如果数据集大得多,那么您可能无法使用自动数组。请改用weight

另一答案
price

无论你在尝试什么都是正确的。上面是你想要做的代码我是这么认为的。我只是编译并运行代码。它可能已经解决了你的问题。

以上是关于如何在C ++中创建循环内的结构成员的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C/C++ 中创建 JNIEnv 模拟

如何在C#后面的代码中动态创建数据模板并绑定树视图层次结构数据

如何在 C 中动态定义结构元素

我将如何在 c 中创建一个输出流,如 stdout?

如何使用引导程序和 for 循环在 django 中创建电影片段?

如何在类属性的Objective C中创建类似json的结构?