C ++创建和收集循环中的结构
我想从文件中按行收集的数据创建一个结构体。 每一行都需要一个新的结构,并且这些行在while循环中被访问。 在C#中,我通过创建匿名结构并将它们添加到结构列表中来完成此操作。 C ++似乎不允许匿名结构。 我尝试用增量变量命名它们,但这不起作用,因为变量名是从字面上理解的 - 无论如何,我不希望被迫使用这种方法,因为我讨厌不相关的名称。 我想我可以通过一个独特的属性命名该结构,但显然,我宁愿使用一个属性。 。 。 属性。 此外,如果它们不一定都是唯一的呢?
有人可以提出一些建议或解释我缺少的东西吗?
谢谢!
在c#中(psuedo:
public static List<Referral> Referrals = new List<Referral>();
//in loop:
var NewReferral = new Referral(referringURL.Trim(), referringWords.Trim().ToLower() , 1);
if ( NewReferral.URL == referringURL.Trim() ) {Referrals.Add(NewReferral);
在c ++中:
list<CollectedData> AllData;
ifstream myFile("test_data.txt");
if (myFile.fail()) {cout << "Error opening file"; return 0;}
else
{
cout << "File opened... n";
while( getline(myFile, line) ) {
struct CollectedData;
//add property values
//add struct to struct list
}
}
(请详细了解他们何时自动删除,这可能不会有帮助,但我想知道,谢谢!)
除了两件事外,你的C ++看起来是正确的。 一,你必须在某处定义一个CollectedData结构体的形式,而你必须给你的结构变量命名一个:
例如,如果您像这样定义CollectedData结构
struct CollectedData {
int field1;
std::string field2;
bool field3;
// etc
};
然后在你的内部循环中,你可以做到这一点
while( getline(myFile, line) ) {
CollectedData lineData;
//add property values
lineData.field1 = /*whatever*/;
lineData.field2 = /*whatever*/;
lineData.field3 = /*whatever*/;
//add struct to struct list
AllData.push_back(lineData);
}
每次通过循环创建一个新的CollectedData对象,并填充其字段,然后将其副本压入AllData列表,然后最终该对象自动销毁(记住列表中仍存在副本)。
关于何时销毁对象的细节
C ++有三种存储:静态,自动和动态。
静态存储对象存在于程序的整个生命周期中。 任何在类或函数之外创建的对象都是静态的(即全局变量是静态的)。 对于使用'static'关键字在类或函数内部声明的任何内容也是如此。
动态存储对象是使用关键字'new'(或用malloc()创建的对象,但这是一个C-ism,除非确实需要,否则通常应该在C ++中避免这种情况)。 动态存储对象是其生命周期由程序员手动管理的对象。 动态存储的对象将继续存在,直到使用关键字“delete”销毁它。 请注意,您可以访问动态存储的对象的唯一方法是通过指针或引用。 如果不使用指针或引用,它不是动态的(但指针/引用也可以引用非动态对象)。
自动存储对象是常规变量:结构和类的成员变量以及方法和函数中的局部变量(包括参数)。
当定义它们的代码行被运行时,函数内定义的自动存储对象被创建。 当它们“超出范围”时,它们会自动销毁,也就是说,当它们在内部声明的块终止时。 通常,“块”是一组大括号:{}。 因此,函数内部创建的任何内容都会在函数返回时被销毁,同样,当循环体内部创建的任何内容在循环结束时自动销毁(不管它是终止还是迭代)。
被定义为类或结构成员的自动存储对象在包含它们作为成员的对象被创建时被创建,并且当包含它们作为成员的对象被销毁时被创建并被销毁。
(我在上面反复使用了“object”这个术语,但是相同的规则适用于像int,char,bool等基本类型)
你问的问题有点不清楚。 我推断你的意思是每个结构对于每一行都有相同的字段,如SQL数据库中的列。 这意味着对于文件中的每一行你没有不同的结构定义。
所以,假设你所有的结构都有相同的领域,这个工作很容易; 简单地为你的结构定义一个拷贝构造函数,然后你可以将它们添加到一个std::vector
或一个std::list
或你自己的array / list / deque / whatever的实现中。
struct mystruct
{
int a,b,c;
// has default (shallow-copy) constructor, coz that's fine for integral types...
}
void readfromfile( YourFileClass *pFile, /* etc.. */ )
{
mystruct temp;
std::list<mystruct> result;
// read each line into the temp struct one at a time, add to a list
while ( pFile->ReadNextFileLineIntoStruct( &temp ) )
{
result.push_back( temp );
}
// result has a linked list of data...
}
你也可以每次在循环中new
一个你的结构体的实例,并将这些结构体的指针添加到列表中(如Smashery所建议的那样),但要注意当列表被删除时这些对象将不会被释放 - 你会需要遍历整个列表并在完成每个条目时调用delete
,否则将无法挽回地泄漏内存。
(你也可以创建一个继承自std::list
并正确地释放它的析构函数中的每个条目,但是如果你不知道你在做什么,这会进入危险的领域。)
甲struct
在C ++是一种数据结构,其全部“结构”(布局,成员类型的成员)是在编译时定义。
你可能想要像hashtable(或其他关联/ map-like数据结构)的东西,而在每行文件中有一个这样的结构,比如说一个数组?
链接地址: http://www.djcxy.com/p/82471.html