2

我正在尝试存储一些每次都会更改的元素,但我不知道哪个

方法更好,为什么。我正在考虑两种方法,1)声明 int 和循环数组或

使用向量的。

哪种方式更好,为什么?

声明 int 数组是否有任何未来的内存问题作为泄漏?

下面的代码显示了我正在谈论的两种方式:

1)

#include <iostream>
#include <vector>


int main()
{

     int x[5];

     x[0] = 10;
     x[1] = 20;
     x[2] = 30;
     x[3] = 40;
     x[4] = 50;


for(unsigned int i = 0;i<=sizeof(x[5]); i++)
    {


     std:: cout << "x[" << i << "] = "<< x[i] << std::endl;

}

system("pause");

    return 0;
}

2)

#include <iostream>
#include <vector>


int main()
{

    std::vector<int> x;

    x.push_back(10);
    x.push_back(20);
    x.push_back(30);
    x.push_back(40);
    x.push_back(50);


for(unsigned int i = 0;i<=x.size()-1; i++)
    {


     std:: cout << "x[" << i << "] = "<< x[i] << std::endl;

}

system("pause");

    return 0;
}
4

3 回答 3

8

如果这就是您所要做的,并且您的数组将始终具有在编译时已知的大小,那么您不需要std::vector.

另一方面,在 C++11 中,您可以使用std::array而不是普通的 C 数组(std::array是 C 数组的零开销、更安全且功能更强大的包装器):

#include <iostream>
#include <array>

int main()
{
     std::array<int, 5> x = { 10, 20, 30, 40, 50 };
     for (unsigned int i = 0; i < x.size(); i++)
     //                           ^^^^^^^^
     {
         std:: cout << "x[" << i << "] = "<< x[i] << std::endl;
     }
}

这是一个活生生的例子。请注意,它std::array提供了一个size()成员函数,您可能希望使用它来代替sizeof运算符。

此外,由于std::array它是一个标准的序列容器,您可以通过这种方式遍历其元素:

 std::size_t i = 0;
 for (auto e : x)
 {
     std:: cout << "x[" << i++ << "] = "<< e << std::endl; 
 }

这是一个活生生的例子

于 2013-04-16T20:52:37.530 回答
5

如果在编译时知道大小,请使用std::array. 如果没有,请使用std::vector. 在任何一种情况下,都使用迭代器来查看元素:

typedef std::array<int> my_container_type;
typedef my_container::iterator iterator;
my_container_type my_container = { whatever };

for (iterator it = my_container.begin(); it != my_container.end(); ++it)
    std::cout << "x[" << (it - my_container.begin()) << "] = " << *it << '\n';

通过使用迭代器,您可以大大降低意外使用循环限制的风险,例如sizeof(x[5]),这是无稽之谈。

于 2013-04-16T20:57:21.093 回答
3

两者都不是“更好”。它们都针对完全不同的用例。

如果您在编译时知道数组大小并且 100% 确定它永远不会改变,那么当然,请使用普通的旧数组。它的开销更少,编译器甚至可以通过发现任何读取边界之外的尝试来帮助您进行静态分析。

另一方面,如果您不确定数组的一侧(即您将从文件或用户读取输入),则使用std::vector. 它可以增长到任何大小以满足您的需求。

于 2013-04-16T20:55:18.833 回答