cpp中vector的奇怪行为
Strange behaviour of vector in cpp
我正在编写多项式乘法算法的朴素版本。我尝试了以下代码:
#include <iostream>
#include <vector>
using namespace std;
vector<int> multp(const vector<int>& A, const vector<int>& B) {
vector<int> result = {0};
for(int i = 0; i < A.size() + B.size(); i++) {
result[i] = 0;
}
for (int i = 0; i < A.size(); i++) {
for (int j = 0; j < B.size(); j++) {
result[i + j] += A[i] * B[j];
}
}
return result;
}
int main () {
vector<int> A = {1, 1};
vector<int> B = {1, 1, 1};
vector<int> result = multp(A, B);
for (int i = 0; i < 4; i++) {
cout << result[i] << " ";
}
return 0;
}
它工作得很好,但是后来,我将向量的初始化从 vector<int> result = {0};
更改为仅 vector<int> result;
。在这里我遇到了段错误!这是为什么? = {0}
有什么区别?
此外,在主要的 vector<int> result = multp(A, B);
行之后,当我尝试打印向量的长度 (cout << result.size() << endl;
) 时,即使向量中有 4 个元素,我也得到了 1。为什么会这样?
您不能修改或访问不存在的数组元素。当您创建一个空向量时,它没有您可以修改或访问的元素。
vector<int> result = {0}; // creates vector with one entry
for(int i = 0; i < A.size() + B.size(); i++) {
result[i] = 0; // legal only when i==0
}
vector<int> result = {0};
使用一个元素创建一个 vector
,因此您不能访问除 result[0]
以外的任何内容。另一种方法是创建包含所需元素的向量,A.size() + B.size() - 1
.
示例:
#include <iostream>
#include <vector>
std::vector<int> multp(const std::vector<int>& A, const std::vector<int>& B) {
std::vector<int> result(A.size() + B.size() - 1); // correct size
/* this is not needed, they will be 0 by default
for(int i = 0; i < A.size() + B.size(); i++) {
result[i] = 0;
}
*/
for(size_t i = 0; i < A.size(); i++) {
for(size_t j = 0; j < B.size(); j++) {
result[i + j] += A[i] * B[j];
}
}
return result;
}
int main() {
std::vector<int> A = {1, 1};
std::vector<int> B = {1, 1, 1};
std::vector<int> result = multp(A, B);
for(int resval : result) { // a convenient range based for-loop
std::cout << resval << ' ';
}
std::cout << '\n';
}
我正在编写多项式乘法算法的朴素版本。我尝试了以下代码:
#include <iostream>
#include <vector>
using namespace std;
vector<int> multp(const vector<int>& A, const vector<int>& B) {
vector<int> result = {0};
for(int i = 0; i < A.size() + B.size(); i++) {
result[i] = 0;
}
for (int i = 0; i < A.size(); i++) {
for (int j = 0; j < B.size(); j++) {
result[i + j] += A[i] * B[j];
}
}
return result;
}
int main () {
vector<int> A = {1, 1};
vector<int> B = {1, 1, 1};
vector<int> result = multp(A, B);
for (int i = 0; i < 4; i++) {
cout << result[i] << " ";
}
return 0;
}
它工作得很好,但是后来,我将向量的初始化从 vector<int> result = {0};
更改为仅 vector<int> result;
。在这里我遇到了段错误!这是为什么? = {0}
有什么区别?
此外,在主要的 vector<int> result = multp(A, B);
行之后,当我尝试打印向量的长度 (cout << result.size() << endl;
) 时,即使向量中有 4 个元素,我也得到了 1。为什么会这样?
您不能修改或访问不存在的数组元素。当您创建一个空向量时,它没有您可以修改或访问的元素。
vector<int> result = {0}; // creates vector with one entry
for(int i = 0; i < A.size() + B.size(); i++) {
result[i] = 0; // legal only when i==0
}
vector<int> result = {0};
使用一个元素创建一个 vector
,因此您不能访问除 result[0]
以外的任何内容。另一种方法是创建包含所需元素的向量,A.size() + B.size() - 1
.
示例:
#include <iostream>
#include <vector>
std::vector<int> multp(const std::vector<int>& A, const std::vector<int>& B) {
std::vector<int> result(A.size() + B.size() - 1); // correct size
/* this is not needed, they will be 0 by default
for(int i = 0; i < A.size() + B.size(); i++) {
result[i] = 0;
}
*/
for(size_t i = 0; i < A.size(); i++) {
for(size_t j = 0; j < B.size(); j++) {
result[i + j] += A[i] * B[j];
}
}
return result;
}
int main() {
std::vector<int> A = {1, 1};
std::vector<int> B = {1, 1, 1};
std::vector<int> result = multp(A, B);
for(int resval : result) { // a convenient range based for-loop
std::cout << resval << ' ';
}
std::cout << '\n';
}