Visual studio 给出超出范围的错误代码块不会

Visual studio giving an out of range error codeblocks does not

我运行以下代码

#include <vector>
#include <complex>

#define N 8192

int main() {
    std::vector< std::complex<double> > input;
    input.reserve(N);

    for (size_t k = 0; k < N; k++) {
        input[k] = std::complex<double>(k, 0.0);
    }
}

在 codeBlocks 和 Visual Studios 2019 中。后者给出运行时错误“vector subscript out of 运行ge”,而在 codeBlocks 中它运行良好。这是怎么回事,我该如何解决?

http://www.cplusplus.com/reference/vector/vector/reserve/

reserve 仅保证 vector 在达到保留容量之前不需要重新分配元素。

有关详细信息,请参阅所提供的 link 中的示例。

使用 resize 函数实际调整容器的大小以包含元素,这样您就不会超出容量。

矢量下标超出范围告诉您您试图访问一个不可用的索引。

首先,因为你知道确切的大小——你可以使用原始数组,例如 std::complex<double> input[N];或 std::array instead of vector. In any case the whay you are using STL container like vector or set is wrong. Generally you should use push_back or preferably emplace_back 将对象插入到动态容器的末尾。 第二个注意事项 - C++ 不是 C 避免定义像宏这样的常量。 例如:

#include <vector>
#include <complex>
#include <iostream>

int main(int argc, const char** argv) {
    constexpr const std::size_t COMPLEX_COUNT = 8192;
    std::vector< std::complex<double> > input(COMPLEX_COUNT);
    for (std::size_t i = 0; i < COMPLEX_COUNT; i++) {
        input.emplace_back( i, 0.0 );
    }
    for(auto it: input) {
       std::cout << it << ' ';
    }
    std::cout << std::endl;
    return 0;
}

读一些关于 STL 的书,比如 Scott Meyers 的 Effective STL