【问题标题】:is there any way to define dynamic array without Determine the size of it有没有办法定义动态数组而不确定它的大小
【发布时间】:2020-12-05 02:33:15
【问题描述】:

我需要一个不需要缩放(确定)到固定数字的动态数组,如下所示

string* s;

到目前为止,我有这段代码,但显然它不起作用。

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    fstream f;
    f.open("resa.txt");
    string* s;
    int i = 0;
    while (f.good())
    {
        f >> *(s + i);
        i++;
    }
    return 0;
}

这是我的任务:

现在我们稍微改变一下类定义。不再出现静态数组。数组改为动态的事实意味着需要修改某些类方法,并且某些/某些类需要复制构造函数和赋值方法(或叠加的赋值运算符)。 [...]”

这意味着,我就是不能使用数据结构。

【问题讨论】:

  • 不,我就是不能使用数据结构!!
  • 为什么不呢?您可以使用什么?
  • 我把任务链接放在了编辑里,你会在最后一行看到我在说什么,希望你明白我的意思
  • 只是一个提示:使用整个 std 命名空间被认为是bad practice。只需导入您需要的。
  • 如果您只复制问题中的任务或规则而不是提供此图像,会更有意义。这对SEO也更好。我编辑了你的帖子。

标签: c++ arrays dynamic


【解决方案1】:

这不是自动的,每次你想要调整大小、将元素复制到新数组并删除旧数组时都必须分配更多内存。幸运的是,标准库为您提供了 std::vector - 一个自动调整大小的数组。

#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
    fstream f;
    f.open("resa.txt");
    string temp;
    std::vector<std::string> s;
    while (f >> temp)
    {
        s.push_back(temp);
    }
    return 0;
}

我还修正了您的输入读数 - 请参阅 Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())) considered wrong?(也适用于 good())。


或者,您可以使用std::istream_iterator 在一行中初始化向量,而不是使用循环(感谢Ayxan):

vector<string> s{ istream_iterator<string>{f}, {} }; 

【讨论】:

  • vector&lt;string&gt; s{ istream_iterator&lt;string&gt;{f}, {} };怎么样
  • @Ayxan 添加。我想保持简单(为此省略了std::move),但你的解决方案是一个很酷的oneliner :)
  • 不使用数据结构就没有别的办法了吗???
  • @AboudAl-Salem 任何允许您想要的行为的语言级构造都必须执行与标准容器之一相同的操作。如果要存储数据,则必须有内存才能放入,这意味着扩展结构的大小需要基于节点的链接结构或复制数据,各有利弊。
  • @AboudAl-Salem 好吧,您需要一个数据结构——std::string 的数组(而std::string 本身就是一个数据结构)。如果您不想要 std::vector 或其他 STL 容器,您最终将自己重新实现向量 - new 一个字符串数组,读取下一个元素,new 更大的数组,复制现有元素,delete 旧数组,读取下一个元素,new 更大的数组...
猜你喜欢
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多