如何在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
做这个也是你设定的。
请注意,如果您在循环中分配它们之前尝试读取任何成员,则会有未定义的行为,因为weight
和price
都未初始化。
我想要的是拥有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
用数组price
和products
的元素的相应值初始化。
我有5个成员,1个体重,或者我有1个成员,5个体重(作为向量)?
你有一个包含data1
类型的5个元素的数组。所有data2
实例都有一个Product
成员(还有一个你没有初始化的Product
成员)。
这只是我想要做的一个例子,因为我的数据集要大得多
如果数据集大得多,那么您可能无法使用自动数组。请改用weight
。
price
无论你在尝试什么都是正确的。上面是你想要做的代码我是这么认为的。我只是编译并运行代码。它可能已经解决了你的问题。
以上是关于如何在C ++中创建循环内的结构成员的主要内容,如果未能解决你的问题,请参考以下文章
如何在C#后面的代码中动态创建数据模板并绑定树视图层次结构数据