#include <iostream>
#include <vector>
int main()
{
std::vector<double> test1(1);
test1[100] = 5.;
std::vector< std::vector <double > > test2(1, std::vector<double>(1,0));
test2[50][100] = 5.;
}
test1
:很好地调整大小并分配内存
test2
:"Segmentation fault (core dumped)"
。为什么呢?
注意:不能使用矩阵,因为行大小不相等。
摘要:
at(int)
:检查边界并在必要时抛出异常 - 没有调整大小
operator[](int)
:不检查边界 - 没有调整大小
push_back()
:如果当前容量很小,则将capacity()
的大小增加一倍
size()
:vector
capacity()
:在重新分配之前要保留的最大元素
答案 0 :(得分:3)
您可以访问大小为1的向量的索引为100的元素。您不应该从向量边界中访问索引。事实上,它是纯粹的运气,它在第一种情况下起作用而不是奇怪的第二种情况不起作用。
向量会在调用resize()
或push_back
时展开,但只是访问索引不会扩展向量的大小。相反,它会导致未定义的行为。
修复代码do(更改构造向量时使用的大小):
#include <iostream>
#include <vector>
int main()
{
std::vector<double> test1(101);
test1[100] = 5.;
std::vector< std::vector <double > > test2(51, std::vector<double>(101,0));
test2[50][100] = 5.;
}
答案 1 :(得分:1)
您正在访问每个向量的边界之外:
std::vector<double> test1(1); // size 1 vector
test1[100] = 5.; // out of bounds access
结果是未定义的行为。如果你想制作100号矢量,请执行以下操作:
std::vector<double> test1(101); // size 101 vector
test1[100] = 5.; // OK, access 101th element
test.push_back(42); // push element, size is now 102
答案 2 :(得分:1)
test1:很好地调整大小并分配内存
std :: vector将在调用std::vector::push_back时调整大小并分配内存,但不能通过随机访问运算符随机分配
test2:“分段错误(核心转储)”。为什么呢?
下面的代码访问超出了test1的范围,test2:
test1[100] = 5.0;
test2[50][100] = 5.0;
您可以在访问前测试矢量大小
if (test1.size() > 100))
{
test1[100] = 5.0;
}
或者可以在try / catch块中使用std::vector::at函数:
try
{
test2.at(50).at(100) = 5.0;
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
}
答案 3 :(得分:0)
如果您希望operator []自动展开/插入,请使用std :: map:
#include <iostream>
#include <map>
int main()
{
std::map<double> test1;
test1[100] = 5.; // Will insert one element into test1
std::map< std::map <double > > test2;
test2[50][100] = 5.; // will create a new map<double> and insert one element into it.
}