【问题标题】:Should I use vectors instead of arrays?我应该使用向量而不是数组吗?
【发布时间】:2014-07-03 17:28:34
【问题描述】:

如果我有一个固定数量属于 MyClass 类的元素,我应该使用数组还是向量?例如:

MyClass* myArray[];

std::vector<MyClass*> myVector;

?

【问题讨论】:

  • 可能是std::array。这取决于你有多少元素。如果太多,您可能必须使用std::vector
  • 如果元素由当前实例管理或在当前范围内使用std::array&lt;MyClass, N&gt;std::array&lt;MyClass*, N&gt; 否则。
  • 还要考虑使用类的向量而不是指针的向量。指针在那里没有任何作用,除非你在做多态性或共享所有权,在这种情况下,智能指针比裸 C 指针好得多。
  • vector&lt;MyClass&gt;vector&lt;MyClass *&gt; 更不让人头疼,如果你能以这种方式满足你的要求的话。 (array 也是如此)
  • 如果你必须使用指向MyClass的指针,你至少应该使用shared_ptrunique_ptr

标签: c++ arrays vector


【解决方案1】:

如果您知道编译时的数字 - 使用静态 array

如果数字是动态的(从用户那里获得)-vector 会更好地为您节省管理内存的障碍

【讨论】:

    【解决方案2】:

    对少量静态元素使用std::array 或原始数组。

    如果您有很多元素(超过 100kb),您会占用堆栈并要求堆栈损坏/溢出。在这种情况下,或者如果元素的数量只能在运行时知道,请使用std::vector

    【讨论】:

    • std::array 和原始数组有什么区别? std::array 不是和数组一样,只是指定了命名空间吗?
    • 这可能是一个很好的单独问题。不过对于初学者来说,有en.cppreference.com/w/cpp/container/array
    【解决方案3】:

    “固定”在这种情况下有两个含义。通常的设置是设置一次,永不改变,例如从输入中读取的值。这个值在运行时是已知的,需要在堆上动态分配。您的选项是带有 new 或向量的 C 样式数组;强烈建议您使用矢量。

    #include <vector>
    #include <iostream>
    int main() {
        int size;
        std::cin >> size;
        int *myArray = new int[size];
        std::vector<int> myVector(size);
    }   
    

    “固定”也可以表示一个编译时常量,这意味着它对于程序的任何运行都是常量。您可以使用 C 样式的数组或 C++ 数组(在堆栈上自动分配内存)。

    #include <array>
    int main() {
        const int size = 50;
        int myArray[size];
        std::array<int, size> myArray;
    }
    

    这些速度更快,但您的程序需要能够访问足够的堆栈内存,您可以在项目设置中更改这一点。请参阅this topic 了解更多信息。如果数组的大小真的很大,您可能需要考虑在堆上分配(向量)。

    【讨论】:

    • +1 但“静态内存分配(堆栈)。”删除这些词。可能会与静态存储持续时间混淆。
    • automatic 是此类分配的标准术语
    • 已编辑。希望它现在不那么混乱,更正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2023-03-15
    • 2011-03-02
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多