目前正在学习C ++并偶然发现了这个问题
std::vector<int> example;
example[0] = 27;
std::cout << example[0];
这会导致程序崩溃,但如果我定义了一个大小std::vector<int> example(1)
,它就可以了。我还注意到,如果我在不定义大小的情况下使用example.push_back(27)
代替example[0] = 27
,它也可以正常工作。这背后有理由吗?
答案 0 :(得分:2)
空向量没有在内存中分配的元素。
您应该使用example.push_back(27)
而不是尝试下标。 push_back()
分配一个新元素,然后将其添加到向量中。将新元素添加到矢量后,可以使用example[0] = something
重新分配。
答案 1 :(得分:1)
原因很简单:空向量没有元素,因此您不能使用下标运算符。没有分配内存,也没有创建可以使用下标运算符访问它的元素
至于方法push_back
,它会向向量添加一个元素。
也按照你写的方式使用构造函数
std::vector<int> example(1)
创建一个包含一个元素的向量。
答案 2 :(得分:1)
来自:http://www.cplusplus.com/reference/vector/vector/operator[]/
<强>的std ::矢量::操作符[] 强>
访问元素
返回对向量容器中位置n处元素的引用。
类似的成员函数vector :: at与此操作符函数具有相同的行为,除了对vector :: at进行绑定检查,并通过抛出out_of_range异常来通知请求的位置是否超出范围。
可移植程序永远不应该使用超出范围的参数n来调用此函数,因为这会导致未定义的行为。
这可能会因为std :: map而在STL中引起混淆,例如:
std::map<int, std::string> myMap;
myMap[0] = "hello"
将创建映射(如果尚不存在)。
答案 3 :(得分:1)
更具体地说,您正在使用默认构造函数,因此向量没有义务分配任何内存(因为您没有要求它)。
因此,如果您运行以下代码:
std::vector<int> e;
cout<< e.size() << endl;
cout<< e.capacity() << endl;
它会打印0和0.因此size
为0
正如documentation所述:
如果容器大小大于n,则函数永远不会抛出 例外(无投保证)。否则,行为未定义。
e.push_back(5);
std::cout << e[0];
会工作。