要获取std::vector的大小,应调用其.size()成员函数,它返回当前元素数量,时间复杂度为O(1);size()表示实际元素个数,capacity()表示已分配内存可容纳的元素总数,size() ≤ capacity();通过reserve(n)可预先分配内存避免频繁扩容提升性能,shrink_to_fit()则尝试释放多余容量;需注意扩容会导致迭代器、指针失效,且resize()改变元素数量而reserve()仅改变容量。

在C++中,要获取
std::vector
.size()
vector
要获取
std::vector
.size()
std::vector::size_type
std::size_t
vector
举个例子:
#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<int> numbers = {10, 20, 30, 40, 50};
    // 获取vector中元素的数量
    size_t currentSize = numbers.size();
    std::cout << "vector 'numbers' 的当前大小是: " << currentSize << std::endl; // 输出 5
    numbers.push_back(60); // 添加一个元素
    std::cout << "添加元素后,vector 'numbers' 的大小是: " << numbers.size() << std::endl; // 输出 6
    std::vector<std::string> words;
    std::cout << "空vector 'words' 的大小是: " << words.size() << std::endl; // 输出 0
    if (words.empty()) { // 也可以用empty()来判断是否为空
        std::cout << "'words' vector 是空的。" << std::endl;
    }
    return 0;
}.size()
vector
立即学习“C++免费学习笔记(深入)”;
std::vector
size()
capacity()
这是个很常见的问题,也常常让人感到困惑。在我看来,理解
size()
capacity()
std::vector
size()
vector
而
capacity()
vector
所以,一个核心的关系是:
size() <= capacity()
vector
push_back
size()
capacity()
vector
举个例子,你有一个
vector
push_back
vector
push_back
push_back
#include <iostream>
#include <vector>
int main() {
    std::vector<int> data;
    std::cout << "初始状态: size = " << data.size() << ", capacity = " << data.capacity() << std::endl;
    for (int i = 0; i < 10; ++i) {
        data.push_back(i);
        // 观察size和capacity的变化
        std::cout << "添加 " << i << ": size = " << data.size() << ", capacity = " << data.capacity() << std::endl;
    }
    // 假设在我的系统上,vector的扩容策略是翻倍
    // 当size达到capacity时,capacity会翻倍
    // 比如:0, 1, 2, 4, 8, 16...
    // 每次capacity变化都意味着一次内存重新分配和元素拷贝
    return 0;
}通过观察上面的输出,你会发现
capacity
push_back
size
capacity
vector
reserve()
shrink_to_fit()
既然我们知道了
capacity
reserve()
shrink_to_fit()
reserve(n)
vector
push_back
reserve(n)
n
push_back
vector
#include <iostream>
#include <vector>
#include <chrono> // 用于测量时间
int main() {
    std::vector<int> numbers;
    const int num_elements = 1000000;
    // 不使用reserve()
    auto start_no_reserve = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < num_elements; ++i) {
        numbers.push_back(i);
    }
    auto end_no_reserve = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> diff_no_reserve = end_no_reserve - start_no_reserve;
    std::cout << "不使用reserve(),添加 " << num_elements << " 个元素耗时: " << diff_no_reserve.count() << " 秒" << std::endl;
    numbers.clear(); // 清空,准备下一次测试
    // 使用reserve()
    auto start_reserve = std::chrono::high_resolution_clock::now();
    numbers.reserve(num_elements); // 提前预留空间
    for (int i = 0; i < num_elements; ++i) {
        numbers.push_back(i);
    }
    auto end_reserve = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> diff_reserve = end_reserve - start_reserve;
    std::cout << "使用reserve(),添加 " << num_elements << " 个元素耗时: " << diff_reserve.count() << " 秒" << std::endl;
    // 你会发现使用reserve()通常会快很多
    return 0;
}通过上面的测试,你会直观地感受到
reserve()
shrink_to_fit()
reserve()
shrink_to_fit()
vector
size()
vector
vector
shrink_to_fit()
vector
需要注意的是,
shrink_to_fit()
vector
size()
#include <iostream>
#include <vector>
int main() {
    std::vector<int> data;
    data.reserve(100); // 预留100个空间
    for (int i = 0; i < 5; ++i) {
        data.push_back(i);
    }
    std::cout << "填充少量元素后: size = " << data.size() << ", capacity = " << data.capacity() << std::endl; // size=5, capacity=100
    data.shrink_to_fit(); // 尝试收缩容量
    std::cout << "调用shrink_to_fit()后: size = " << data.size() << ", capacity = " << data.capacity() << std::endl; // size=5, capacity可能变为5
    return 0;
}shrink_to_fit()
vector
vector
对
vector
频繁的内存重新分配:这是最主要的性能陷阱。每次
capacity
reserve()
迭代器、指针和引用的失效:当
vector
capacity
vector
#include <iostream>
#include <vector>
int main() {
    std::vector<int> nums = {1, 2, 3};
    int* p_first = &nums[0]; // 指向第一个元素的指针
    std::cout << "原始第一个元素: " << *p_first << std::endl; // 1
    // 此时nums的capacity可能很小,比如3或4
    // 连续push_back可能导致扩容
    nums.push_back(4);
    nums.push_back(5); // 假设这次push_back导致了扩容
    // 此时p_first可能已经失效了,因为它指向的内存可能已经被释放
    // 尝试访问它可能导致段错误或其他未定义行为
    // std::cout << "扩容后第一个元素 (可能失效): " << *p_first << std::endl; // 危险操作!
    // 正确的做法是重新获取指针或迭代器
    p_first = &nums[0];
    std::cout << "扩容后重新获取的第一个元素: " << *p_first << std::endl; // 1
    return 0;
}这个陷阱非常隐蔽,尤其是在大型项目中,一个看似无害的
push_back
resize()
reserve()
resize(n)
vector
size()
n
size()
vector
n
size()
vector
resize()
reserve(n)
vector
capacity()
size()
reserve()
vector
resize()
clear()
erase()
clear()
vector
size()
capacity()
erase()
size()
capacity()
vector
std::vector<T>().swap(myVector);
vector
myVector
myVector
myVector
vector
总之,高效地使用
std::vector
reserve()
resize()
clear()
shrink_to_fit()
以上就是如何在C++中获取vector的大小_C++ vector大小与容量管理的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号