【问题标题】:Using list for dynamic structure allocation使用列表进行动态结构分配
【发布时间】:2019-12-18 18:40:50
【问题描述】:

这是我第一次来这里!

我想做一些简单的事情,但对于我的生活,我似乎无法弄清楚......

我正在读取一个包含数据的文件。在这些数据中,我有对我有意义的特定标签。我称它们为“标签”,但在文件中,它是代表某事的文本字符串。我需要在找到每个标签之后提取这些标签以及其他两个字符串。标签和数据将存储在一个动态创建的结构中,因为我不知道要提取多少标签。所以我不能创建一个包含 100 个元素的结构,因为我可能只需要 50 个,就像我需要 150 个一样。

基本上,文件在循环中连续读取,直到遇到 EOF。当文件被解析时,当找到一个标签时,标签名称和相关的以下两个字符串被正确读取。然后我需要将它们存储在结构中。提取后,循环重新开始并一直重复标签和数据提取直到结束。一旦整个文件被读取并且所有标签都被提取到一个动态结构中,所有这些数据将被转储到一个文件中,然后可以刷新动态分配的内存。

有人告诉我要使用列表,但我似乎不知道如何使它起作用。理想情况下,一段功能性的代码会很有帮助。我在 C++ 中执行此操作(C 很好)。

我尝试过但未编译的示例:

struct MyStruct
{
    char Tag[30];
    char String1[30];
    char String2[30];
};

int Counter;

std:list<MyStruct> MyList;

MyStruct Data;

std:list<MyStruct>::iterator it;


for( Counter = 0; Counter < 5; Counter++)
{
    strcpy( Data.Tag, "Tag" );
    strcpy( Data.String1, "String1" );
    strcpy( Data.String2, "String2" );

    MyList.push_back(Data);
}

it = MyList.begin();
while (it != MyList.end())
{
    cout << "Tag: " << it->Tag << "First: " << it->String1 << "Second: " << it->String2 << endl;
    it++;
}

谢谢!

【问题讨论】:

  • 您到底为什么要为此使用strcpy?为什么char[] 而不是std::string?为什么所有变量名都大写?
  • 您面临的具体问题是什么?您是否坚持阅读文件? std::list::push_back() 已经在处理你的动态分配了。
  • 您在编译代码时遇到了哪些错误?我同意 3Dave 对大写名称的评论。对于 std::string,继续使用 char[],当您的问题解决后,将 char[] 替换为 std::string。
  • 如果需要动态数组,默认使用std::vector。它具有与std::list 相同的接口,但对于大多数操作而言,由于其实现方式,它具有更好的性能。 std::list 实际上只在少数特殊情况下需要,比如当您需要稳定的迭代器时。

标签: c++ arrays list structure


【解决方案1】:

vector 可以根据需要分配更多内存,而不是 list 尝试使用 vector。

std::vector

向量的存储被自动处理,被扩展和 根据需要签约。向量通常比静态占用更多空间 数组,因为分配了更多内存来处理未来的增长。这 向量不需要在每次元素被重新分配时重新分配 插入,但仅在额外内存耗尽时。总数 可以使用 capacity() 函数查询分配的内存量。

例子:

#include <iostream>
#include <vector>

int main()
{
    // Create a vector containing integers
    std::vector<int> v = {7, 5, 16, 8};

    // Add two more integers to vector
    v.push_back(25);
    v.push_back(13);

    // Iterate and print values of vector
    for(int n : v) {
        std::cout << n << '\n';
    }
}

附言

如果您也不知道 Tag、String1、String2 值的长度,请尝试将 MyStruct 变量替换为字符串类型(而不是 char)。

【讨论】:

    【解决方案2】:

    使用 std::list 代替 std:list

    像这样:

         #include <iostream>
        #include <list>
        #include <cstring>
    
        struct MyStruct
        {
            char Tag[30];
            char String1[30];
            char String2[30];
        };
        void something(){
    
            int Counter;
    
            std::list<MyStruct> MyList;
    
            MyStruct Data;
    
            std::list<MyStruct>::iterator it;
    
    
            for( Counter = 0; Counter < 5; Counter++)
            {
                strcpy( Data.Tag, "Tag" );
                strcpy( Data.String1, "String1" );
                strcpy( Data.String2, "String2" );
    
                MyList.push_back(Data);
            }
    
            it = MyList.begin();
            while (it != MyList.end())
            {
                std::cout << "Tag: " << it->Tag << "First: " << it->String1 << "Second: " << it->String2 << std::endl;
                it++;
            }  
        }
    

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 2017-02-04
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多