vector 初始开辟空间
时间: 2024-01-28 15:14:04 浏览: 92
以下是两种C++中vector初始开辟空间的方法:
1. 使用迭代器访问vector:
```cpp
vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
vector<int>::iterator it;
for (it = a.begin(); it != a.end(); it++) {
cout << *it << " ";
}
// 输出:1 2 3
```
2. 使用vector构建二维数组:
```cpp
vector<vector<int>> matrix;
vector<int> a;
a.push_back(1);
a.push_back(3);
a.push_back(1);
matrix.push_back(a);
// 或者使用resize方法
int i, j;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++) {
array[i].resize(3); // 这里一定要使用resize,相当于每行的元素数并已经初始化过了
}
```
相关问题
c++ vector开辟空间
### 如何在C++中为`vector`开辟空间
#### 使用构造函数初始化大小
可以直接通过指定初始容量来创建 `std::vector` 对象。这会预先分配内存并设置向量的大小。
```cpp
#include <vector>
int main() {
std::vector<int> vec(10); // 创建一个含有10个整数的空间,默认初始化为0
}
```
当使用这种方式时,不仅分配了足够的存储位置给定数量的对象,而且这些对象也会被默认构造出来[^1]。
#### 预留额外容量以提高性能
如果预计将来要增加大量元素到容器内,则可以调用成员函数 `reserve()` 来提前预留更多内部缓冲区:
```cpp
vec.reserve(20);
// 这不会改变当前 size(), 只会影响 capacity()
```
此操作仅影响底层数组的最大容纳能力而不实际修改现有数据项的数量;即它调整的是capacity而非size[]^1]。
#### 动态扩展与收缩
每当超出已有的可用范围时,标准库实现通常会选择自动增长其内部使用的连续块状区域。然而,在某些情况下手动管理可能更有效率——比如频繁插入/删除场景下减少不必要的复制开销。对于这种情况下的优化措施之一就是利用移动语义特性。
例如下面展示了如何定义一个带有转移构造器 (move constructor) 的类模板实例化版本:
```cpp
template<typename T>
class MyVector {
public:
MyVector(MyVector&& a) noexcept // 移动构造函数
:sz{a.sz}, elem{a.elem} // 复制 'a' 的成员变量
{
a.sz = 0; // 将源对象置为空状态
a.elem = nullptr;
}
};
```
上述代码片段说明了怎样高效地接管另一个临时对象所持有的资源而无需深拷贝每一个单独元素。
用c++定义一个类包含(学生的英语 数学 语文成绩)该类可以输入学生成绩 以该类为基类生成一个派生类 生成的派生类可以计算学生成绩的平均分(主函数使用开辟空间调用)
在C++中,你可以首先定义一个基础类`Student`,用于存储学生的基本信息如英语、数学、语文的成绩。然后创建一个派生类,例如`AverageStudent`,来添加计算平均分的功能。这里是一个简单的示例:
```cpp
// 基础类 Student
class Student {
private:
double englishScore;
double mathScore;
double chineseScore;
public:
// 构造函数初始化成绩
Student(double eng, double mat, double chi)
: englishScore(eng), mathScore(mat), chineseScore(chi) {}
// 设置和获取成绩的方法
void setScores(double eng, double mat, double chi) {
englishScore = eng;
mathScore = mat;
chineseScore = chi;
}
double getEnglishScore() const { return englishScore; }
double getMathScore() const { return mathScore; }
double getChineseScore() const { return chineseScore; }
};
// 派生类 AverageStudent,计算平均分
class AverageStudent : public Student {
public:
// 计算平均分并返回
double calculateAverage() const {
return (englishScore + mathScore + chineseScore) / 3.0;
}
};
int main() {
// 使用动态内存分配创建派生类的对象
int numStudents;
std::cout << "Enter the number of students: ";
std::cin >> numStudents;
std::vector<AverageStudent*> studentVector(numStudents);
for (int i = 0; i < numStudents; ++i) {
double eng, mat, chi;
std::cout << "Enter scores for student " << (i + 1) << ": ";
std::cin >> eng >> mat >> chi;
// 创建派生类对象并设置成绩
studentVector[i] = new AverageStudent(eng, mat, chi);
}
// 调用派生类的平均分计算方法
for (auto* student : studentVector) {
double average = student->calculateAverage();
std::cout << "The average score of student " << (student - studentVector.begin()) + 1 << " is: " << average << std::endl;
delete student; // 确保释放内存
}
return 0;
}
```
在这个例子中,`main`函数通过动态数组的方式存储了`AverageStudent`对象,并分别设置了每个学生的成绩。之后,通过`calculateAverage`方法计算并打印出每个学生的平均分。
阅读全文