我试图存储一些每次都会改变的元素,但我不知道哪个
方式更好,为什么。我正在考虑两种方式,1)声明int和loop数组或
使用矢量。
哪种方式更好,为什么?
声明int数组是否有任何未来的memore问题作为泄漏?
下面的代码显示了我正在谈论的两种方式:
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;
}
答案 0 :(得分: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;
}
}
这是live example。请注意,std::array
提供了size()
成员函数,您可以使用该函数代替sizeof
运算符。
此外,由于std::array
是一个标准的序列容器,你可以这样迭代它的元素:
std::size_t i = 0;
for (auto e : x)
{
std:: cout << "x[" << i++ << "] = "<< e << std::endl;
}
这是live example。
答案 1 :(得分: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])
等循环限制的风险,这是无意义的。
答案 2 :(得分:3)
两者都不“更好”。它们都解决了完全不同的用例。
如果您在编译时知道数组大小并且100%确定它永远不会更改,请确保使用普通的旧数组。它具有更少的开销,编译器甚至可以通过发现任何超出边界读取的尝试来帮助您进行静态分析。
另一方面,如果您不确定阵列的一侧(即您将从文件或用户读取输入),则使用std::vector
。它可以增长到任何尺寸以满足您的需求。