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';
}