【问题标题】:how can i size a vector in a class?c ++ oop problem如何在类中调整向量的大小?c ++ oop 问题
【发布时间】:2020-06-13 18:58:34
【问题描述】:
#include <iostream>
using namespace std;

class vector{
    private:
        int *arr;
        int n;

    public:
        vector(int a, int n){
            for(int i = 1; i <= n; i ++)
                arr[i] = a;
        }

        vector(){
            for(int i = 1; i <= n; i ++)
                arr[i] = 0;
        }

        void reactualizare_vector(int t, int m){
            n = t;
            for(int i = 1; i <= n; i ++)
                arr[i] = m;
        }

        void afis_vector(){
            for(int i = 1; i <= n; i ++)
                cout << arr[i] << " ";
        }

        void citire_vector(int n){
            for(int i = 1; i <= n; i ++)
                cin >> arr[i];
        }
};

int a, n, t, m;

int main()
{
    cin >> a >> n;

    vector p(a, n);
    p.citire_vector(n);
    p.afis_vector();

    return 0;
}

输入:2 4 2 1 4 3

输出:2 1 4 3 0 0 0 0 1952810132 2543616 1952810096 -594764666 6422492 2002010568 2543616 -1294838125 0 0 2543616 0 0 0 0 -1294838125 6422432 0 6422500 2002070528 -974236977 0 6422508 2002010520 -1 2002121555 0 0 4199136 2543616 0

如何调整向量的大小以不显示 2 1 4 3 之后的内容?

【问题讨论】:

  • 你有一个指针arr,但是它指向哪里?你永远不会让它指向任何地方,这意味着arr 将未初始化并且具有不确定的值。当您取消引用它时,您将有未定义的行为。也许是时候投资a couple of good books,或者阅读您关于动态分配的教程或课堂笔记。
  • C++ programming 上阅读一本好书。阅读一些C++ tutorial。见一些C++ reference site。使用standard containers
  • 并且成员n 从未初始化。
  • 如果使用GCC 编译所有警告和调试信息,那么使用g++ -Wall -Wextra -g
  • 一些注意事项:不要使用using namespace std; 并学习用英文命名变量/方法/函数:例如show_vectorafis_vector 好得多,以此类推。

标签: c++ oop vector constructor size


【解决方案1】:

编码风格(变量命名等)非常重要。我强烈建议学习这些(在上面的 cmets 中提到),但我认为其他人在这个问题上更了解。我自己不认为我有一个好的编码风格可以给别人有用的建议......我只会跳到至少可以让你的代码工作的东西。

1) 类向量中的n 分配不正确。您将n 输入作为全局变量,但它实际上并没有进入课堂。您需要像p.n = n; 这样分配值,但由于矢量类中的n 是私有的,您可以尝试编写一个函数来执行此操作。一种方法可能是将初始化程序修改为

vector(int a, int sz){
    n = sz;
    for(int i = 1; i <= n; i ++)
        arr[i] = a;
}

但是,我认为编写调整大小函数通常是一个更好的主意。

在某些编译器和设置中,应用它可以使您的代码正常工作。

2) 正如上面已经提到的评论,你应该实际分配指针arr。我不知道你为什么忽略arr 中的索引0,但如果你愿意,你可以在初始化步骤中为arr 分配(n+1) * sizeof(int) 字节的内存。这样的事情可能会奏效。

vector(int a, int sz){
    n = sz;
    arr = (int *)(malloc((n+1)*sizeof(int)));
    for(int i = 1; i <= n; i ++)
        arr[i] = a;
}

3)如果你必须写一个向量类,这无关紧要。但是,如果没有特别要求您编写此类,并且您有更重要的任务要做,请使用 std::vector。即使在将我的修复应用到您的代码之后,std::vector 也提供了更好的性能,一大堆有用的功能,如果您必须编写整个矢量类,您很可能会出错并花费数小时的调试时间。避免重新发明轮子。


显然这里写的所有关于内存分配的内容现在似乎都是错误的。我对现代 C++ 内存分配一无所知。请忽略这些,因为我不知道如何删除已接受的答案,如果有人可以删除它。抱歉信息过时了。

【讨论】:

  • malloc?你在开玩笑吗?
  • 请考虑删除此答案。在 2020 年,我们不会在 C++ 中对拥有的内存使用原始指针。还有从不malloc,甚至不是new。缺少析构函数会导致内存泄漏,这是典型的。所以,不要在 C++ 中使用这样的语言结构。
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多