c++ - 如何实际上在C++中 “clear”一个 vector ?

标签 c++ vector

如何以简单的方式清除内容?
如果仅使用vec_vec.clear();, vector 中仍有一些未清除的内容。

#include <iostream>
#include <vector>

int main()
{
    std::vector<std::vector<int>> vec_vec(10);
    vec_vec[0].push_back(1);
    vec_vec[0].push_back(2);
    vec_vec[0].push_back(3);
    vec_vec[0].push_back(4);

    for (auto i : vec_vec[0])
        std::cout << i << " ";
    std::cout << "." << std::endl;

    vec_vec.clear();
    for (auto i : vec_vec[0])
        std::cout << i << " ";
    std::cout << "." << std::endl;


    vec_vec[0].clear();
    for (auto i : vec_vec[0])
        std::cout << i << " ";
    std::cout << "." << std::endl;

    for (int i=0; i<vec_vec.size(); i++)
        vec_vec.erase(vec_vec.begin() + i);
    for (auto i : vec_vec[0])
        std::cout << i << " ";
    std::cout << "." << std::endl;
    
    return 0;
}
1 2 3 4 *
0 0 3 4 *
*
*

最佳答案

vec_vec.clear();
for (auto i : vec_vec[0])

clear之后,vec_vec为空,因此表达式vec_vec[0]具有未定义的行为。
未定义的行为意味着什么都可能发生,这是程序的错误,而不是C++编译器,库等的错误。因此,它的行为可能像一个空 vector ,可能会使程序崩溃,可能会打印一些值,否则它可能会达到您今天的期望,然后在最糟糕的时间休息。
另请参见this Q&A有关未定义,未指定和实现定义的行为。

关于c++ - 如何实际上在C++中 “clear”一个 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63970157/

相关文章:

c++ - 在 C++ 中存储大矩阵的列索引子集的最有效方法是什么?

c++ - 如何有一个 vector 的复制构造函数?

c++ - tbb并发hashmap实现字典ADT

c++ - 如果类为空,则禁用所有类成员函数

c++ - Beagle bone交叉编译动态链接困惑

c++ - 释放指针 vector ,但内存仍在使用中

c++ - (c++) 需要帮助为我的类 Polynomial 重载 operator+

c++ - 免费(): invalid pointer for vector<vec4i> c++

c++ - 在线程上的 2D vector 上 push_back 是安全的吗?

c++ - 关于 vector 和删除与其关联的内存的问题