C++ STL vector详细使用方法

什么是 vector

vector 是 C++ 中的一种数据结构,它可以看作是一个可以动态改变大小的数组。与固定大小的数组不同,vector 在需要时可以自动增加存储空间,以容纳更多的元素。

如何使用 vector

首先,你需要包含 <vector> 头文件,并使用 std::vector 命名空间。

#include <vector>
using namespace std;

然后,你可以创建一个 vector

vector<int> numbers; // 创建一个空的整数 vector

或者初始化一个 vector

vector<int> numbers(10); // 创建一个包含10个整数的 vector,所有元素初始化为0
vector<int> numbers(10, 1); // 创建一个包含10个整数的 vector,所有元素初始化为1
vector<int> numbers(5, 2); // 创建一个包含5个整数的 vector,所有元素初始化为2

如何操作 vector

  • 添加元素

    numbers.push_back(3); // 在 vector 的末尾添加一个元素3
  • 访问元素

    int first = numbers[0]; // 获取第一个元素
    int last = numbers[numbers.size() - 1]; // 获取最后一个元素
  • 改变元素

    numbers[0] = 10; // 改变第一个元素的值
  • 删除元素

    numbers.pop_back(); // 删除最后一个元素
  • 获取大小

    int size = numbers.size(); // 获取 vector 中的元素数量

如何遍历 vector

你可以使用传统的 for 循环:

for (int i = 0; i < numbers.size(); ++i) {
    cout << numbers[i] << " ";
}
cout << endl;

或者使用 vector 的迭代器:

for (vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
    cout << *it << " ";
}
cout << endl;

示例代码

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> numbers(5, 2); // 创建一个包含5个整数的 vector,所有元素初始化为2
    // 添加元素
    numbers.push_back(3);
    // 遍历并打印 vector
    for (int i = 0; i < numbers.size(); ++i) {
        cout << numbers[i] << " ";
    }
    cout << endl;
    // 删除最后一个元素
    numbers.pop_back();
    // 再次遍历并打印 vector
    for (vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}

这段代码创建了一个包含5个整数的 vector,然后在末尾添加了一个元素,接着打印了所有元素,最后删除了最后一个元素并再次打印。

如何输入vector?

将数字输入到 vector 中,可以通过多种方式实现,包括使用 push_back 方法逐个添加,或者使用初始化列表。以下是一些示例:

使用 push_back 方法

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> numbers;
    // 提示用户输入数字
    int num;
    cout << "请输入一些整数(输入非整数结束):" << endl;
    // 使用循环逐个读取并添加到 vector 中
    while (cin >> num) {
        numbers.push_back(num);
    }
    // 输出 vector 中的所有数字
    cout << "你输入的数字是:" << endl;
    for (int i = 0; i < numbers.size(); ++i) {
        cout << numbers[i] << " ";
    }
    cout << endl;
    return 0;
}

在这个例子中,程序会提示用户输入一系列整数。每次用户输入一个数字,程序就会使用 push_back 方法将其添加到 vector 中。当用户输入非整数时(例如,一个字符或一个字符串),循环会结束,程序会输出 vector 中的所有数字。

使用初始化列表

如果你已经知道要添加到 vector 中的数字,可以在创建 vector 时使用初始化列表来一次性添加它们:

#include <iostream>
#include <vector>
using namespace std;
int main() {
    // 在创建 vector 时初始化
    vector<int> numbers = {1, 2, 3, 4, 5};
    // 输出 vector 中的所有数字
    for (int i = 0; i < numbers.size(); ++i) {
        cout << numbers[i] << " ";
    }
    cout << endl;
    return 0;
}

在这个例子中,vector 在创建时就已经包含了初始化列表中的所有数字。

从文件读取

如果你需要从文件中读取数字并存储到 vector 中,可以使用以下方法:

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main() {
    vector<int> numbers;
    ifstream inputFile("numbers.txt"); // 假设文件名为 "numbers.txt"
    int num;
    while (inputFile >> num) {
        numbers.push_back(num);
    }
    inputFile.close();
    // 输出 vector 中的所有数字
    for (int i = 0; i < numbers.size(); ++i) {
        cout << numbers[i] << " ";
    }
    cout << endl;
    return 0;
}

在这个例子中,程序从一个名为 "numbers.txt" 的文件中读取整数,并将它们添加到 vector 中。每个数字都应该在文件中单独一行。 选择哪种方法取决于你的具体需求,例如是否需要用户交互,或者数据是否已经以某种形式准备好了。

注意:当你使用 push_back 方法将数字添加到 vector 中时,新元素会被放置在 vector 的最后一个位置,并且 vector 的长度会增加一个单位。 vector 在内部管理一个连续的存储空间,当你调用 push_back 时,vector 会检查是否有足够的剩余空间来存储新元素。如果有足够的空间,新元素就会被直接添加到当前空间的末尾。如果没有足够的空间,vector 会自动分配一个新的更大的存储空间,将所有现有元素复制到新空间中,然后在新空间的末尾添加新元素,并释放旧的存储空间。 因此,从用户的角度来看,新元素总是被添加到 vector 的“末尾”,即最后一个元素的后面。这意味着新元素的索引将是当前 vectorsize() - 1。 这里有一个简单的例子来演示这个过程:

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> numbers;
    // 添加一些数字到 vector 中
    numbers.push_back(10); // vector: [10]
    numbers.push_back(20); // vector: [10, 20]
    numbers.push_back(30); // vector: [10, 20, 30]
    // 输出 vector 中的所有数字
    for (int i = 0; i < numbers.size(); ++i) {
        cout << numbers[i] << " ";
    }
    cout << endl;
    return 0;
}

在这个例子中,vector 初始是空的。每次调用 push_back,新数字就被添加到 vector 的末尾。最后,vector 包含了三个元素 [10, 20, 30],并且每个元素的位置正好是它们被添加时的顺序。

如何将数字从第一个下标的位置开始读入?

在 C++ 中,vector 不提供直接从第一个下标位置开始读入数字的函数,因为这将需要将所有现有元素向后移动,这是效率低下的。如果你确实需要从 vector 的开头插入元素,你可以使用 insert 函数,但这通常不是一个好主意,因为它会对性能产生负面影响。 如果你想要一个从第一个下标位置开始读入数字的数据结构,你可能需要使用其他的数据结构,比如 deque(双端队列),它允许在两端快速插入和删除元素。 但是,如果你坚持要使用 vector 并希望在开头插入元素,你可以这样做:

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> numbers;
    // 插入一些数字到 vector 的开头
    numbers.insert(numbers.begin(), 10); // vector: [10]
    numbers.insert(numbers.begin(), 20); // vector: [20, 10]
    numbers.insert(numbers.begin(), 30); // vector: [30, 20, 10]
    // 输出 vector 中的所有数字
    for (int i = 0; i < numbers.size(); ++i) {
        cout << numbers[i] << " ";
    }
    cout << endl;
    return 0;
}

在这个例子中,我们使用了 insert 函数,将新元素插入到 vector 的开头。这将导致所有现有元素向后移动,以为新元素腾出空间。这种操作的时间复杂度是 O(n),其中 n 是 vector 中元素的个数。因此,如果你频繁地进行这种操作,你的程序可能会变得非常慢。 如果你的用例确实需要频繁地在序列的开头插入元素,请考虑使用 deque 或其他更适合这种用例的数据结构。

vector可以使用cin,cout输入输出吗?

vector 可以使用 cincout 进行输入和输出,但是直接使用 cincout 输入输出整个 vector 并不常见,因为 vector 通常包含多个元素,而 cincout 是用于处理单个值的。 如果你想要输入或输出 vector 中的所有元素,你通常需要遍历 vector,并对每个元素分别使用 cincout。下面是一个简单的例子,展示了如何使用 cincoutvector 中的元素进行交互:

输入 vector 元素

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> numbers(5); // 创建一个包含5个整数的 vector
    cout << "请输入5个整数:" << endl;
    for (int& num : numbers) {
        cin >> num;
    }
    return 0;
}

在这个例子中,我们创建了一个包含5个整数的 vector,并使用一个范围 for 循环遍历 vector,使用 cin 读取用户输入的值。

输出 vector 元素

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> numbers = {1, 2, 3, 4, 5}; // 创建并初始化一个 vector
    cout << "你输入的数字是:" << endl;
    for (const int& num : numbers) {
        cout << num << " ";
    }
    cout << endl;
    return 0;
}

在这个例子中,我们创建并初始化了一个包含5个整数的 vector,并使用一个范围 for 循环遍历 vector,使用 cout 输出每个元素的值。 如果你想要一次性输入或输出整个 vector,你可能需要使用其他方法,比如重载 >><< 运算符,或者使用其他输入输出库,如 C++ 标准库中的 sstream。这些方法通常更复杂,并且需要更多的代码来处理 vector 的整体输入和输出。

制作不易,点个赞再走我康行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值