gpt4 book ai didi

c++ - 如何将整数输入为空的vector

转载 作者:行者123 更新时间:2023-12-01 15:13:18 24 4
gpt4 key购买 nike

#include <iostream>
#include <vector>

int main(void) {
std::vector<int> ivec;
int n = 4;
for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.begin() + n; ++iter) {
int x;
std::cin >> x;
ivec.push_back(x);
}

return 0;
}

上面是代码。

我想要做的是尝试将4个整数输入一个空 vector 。

结果是它可以编译并运行,但是无论我输入什么,都不会跳出循环。

我做了一些调整。

这是代码:
#include <iostream>
#include <vector>

int main(void) {
std::vector<int> ivec;
int n = 4;
std::vector<int>::iterator tempiter = ivec.begin();
for (std::vector<int>::iterator iter = tempiter; iter != tempiter + n; ++iter) {
int x;
std::cin >> x;
ivec.push_back(x);
}
std::cout << "**********************************" << std::endl;

for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
std::cout << *iter << std::endl;

return 0;
}

这次,它按预期工作正常。

我ivec.begin()应该始终保持不变。

为什么第一次不起作用?
为什么第二遍起作用?

我认为没有太大区别。

最佳答案

三个原因:

  • 无效:std::vector有时会重新分配自身,当这样做时,所有迭代器都会失效。由于您不知道何时发生重新分配,因此应假定每次插入后迭代器都是无效的。
  • 访问冲突:iter + n返回最后一个元素之后的元素,因此在取消引用时可能会导致访问冲突,因此应避免使用。
  • 循环是无限的,因为ivec.begin()会被反复计算,并且原来的iter在内存中。这是一个实现细节,因此可能不会导致另一台机器上的无限循环。

  • 根据我的回答,您的第二个代码应该不能正常工作,如果可以,那是偶然的。

    正确的方法是没有迭代器:

    #include <iostream>
    #include <vector>

    int main(void) {
    std::vector<int> ivec;
    int n = 4;
    // consider writing ivec.resize(n);
    for (int i = 0; i < n; ++i) {
    int x;
    std::cin >> x;
    ivec.push_back(x);
    }

    return 0;
    }

    关于c++ - 如何将整数输入为空的vector <int>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61118497/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com