c++ vector设定长度及初始值
在C++中,vector可以通过resize()函数来设置容器的尺寸大小,并可以用初始值进行初始化。在引用的代码中,通过调用arr.resize(3),可以将vector容器arr的尺寸设置为3。在这种情况下,容器中的元素将被默认初始化为其元素类型的默认值。在引用的代码中,通过vector
C++ 初始值设定项值太多
在 C++ 中,当你需要为大量的数组元素设置初始值时,如果一一列出可能会显得冗长且容易出错,特别是在数组很大或者初始化的值本身比较复杂的情况下。这时,可以采用以下几种方法来简化初始值设定:
静态常量表达式: 如果所有元素都是简单常数,你可以利用数组长度乘以初始值创建一个连续的序列:
const int size = 10; int values[size] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 十个连续的整数
生成器表达式: 使用 C++11 及以上版本的范围基础对于大型数值序列更方便,可以避免显式写出整个序列:
int size = 10; int values[size] = {i for i in range(size)};
初始化列表: 对于一些复杂的计算,如平方、斐波那契数列等,可以先定义一个函数,然后在初始化列表中调用它:
auto square(int x) { return x * x; } int squares[size] = {square(i) for i in range(size)};
预处理器宏: 对于特定类型的值,如位操作后的结果,可以使用宏展开,但这可能导致代码不易理解和维护:
#define VALUE(x) (x << 1) | (x >> 1) int shifted[size] = {VALUE(i) for i in range(size)};
尽管这些方法能简化初始值设定,但如果初始化过程仍然很复杂,考虑使用 std::vector 或动态内存分配会更有优势,因为它们提供更强的灵活性和管理。
C++vector的成员函数
C++ std::vector
容器成员函数
构造函数
除了默认构造函数之外,C++11还引入了新的构造方式,包括移动构造函数和初始化器列表构造函数[^1]。
// 移动构造函数示例
std::vector<int> vec1(5, 10);
std::vector<int> vec2(std::move(vec1));
// 初始化器列表构造函数示例
std::vector<std::string> words = {"hello", "world"};
赋值操作
赋值可以通过重载的等号运算符实现,允许一个向量被另一个相同类型的向量所赋值[^4]。
std::vector<int> v3;
v3 = v2; // 将v2的内容复制给v3
数据访问
提供了多种方法来获取或修改容器内的元素:
- at(size_type n): 返回索引n处的元素,带边界检查。
- operator[](size_type n): 返回索引n处的元素,不带边界检查。
- front(): 返回第一个元素。
- back(): 返回最后一个元素。
- data(): 返回指向内部存储的第一个元素的指针[^3]。
std::vector<int> numbers{1, 2, 3};
numbers.at(0); // 访问第0个位置上的数并做范围检测
numbers[0]; // 同样是访问第0个位置上的数但是不做任何检测
numbers.front(); // 获取最前面的那个数值
numbers.back(); // 获取最后面那个数值
int *ptr = numbers.data(); // 得到指向整个数组起始位置的一个原始指针
修改器
这些函数用来改变现有对象的状态:
- assign(initializer_list
, initializer_list : 使用初始值列表重新分配内容。) - push_back(const T& value) / emplace_back(Args&&... args): 添加新元素至末端。
- pop_back(): 删除最后一个元素。
- insert(iterator pos, const T& value) / erase(iterator first, iterator last): 插入/移除指定位置的单个或多于一项的数据项。
- clear(): 清空所有元素。
- resize(size_type count[, T value]): 改变大小;当增加容量时填充特定值。
- swap(vector
& other) : 快速互换两个同类型向量之间的全部条目而无需逐个拷贝.
std::vector<int> myVec;
myVec.assign({1, 2, 3}); // 用三个整型数字替换当前所有的元素
myVec.push_back(4); // 追加一个新的整数进去
auto it = myVec.begin();
it++; // 把迭代器定位到第二个位置
myVec.insert(it, 99); // 在该位置前插入额外的新成员
myVec.erase(myVec.end()-1); // 删掉最后一项
myVec.clear(); // 彻底清除一切现存的东西
myVec.resize(7, -1); // 扩展成七个单元格,并设定新增部分都等于负一
anotherVector.swap(myVec); // 和别的实例快速交换彼此拥有的东西
容量管理
涉及调整预留空间以及查询实际尺寸的方法如下表所示:
函数名 | 功能 |
---|---|
empty() | 测试是否为空 |
size() | 查询当前长度 |
max_size() | 查看理论上最大可能容纳的数量 |
reserve(size_type new_cap) | 提前申请至少这么多字节的空间以便后续添加更多项目而不必频繁扩容 |
capacity() | 显示已预留给未来增长使用的总字节数 |
if (myVec.empty()) {
std::cout << "The vector is empty.\n";
}
else{
std::cout << "Size of the vector : " << myVec.size() << "\n";
}
// 预留足够的空间以减少动态扩展带来的性能开销
myVec.reserve(100);
// 输出目前可用的最大容量
std::cout << "Capacity reserved for future growth:" << myVec.capacity()<< "\n";
操作子序列
对于提取某一段连续区间作为独立副本的操作也有支持[^2]:
std::vector<int>::iterator start = myVec.begin()+2;
std::vector<int>::iterator end = myVec.begin()+5;
std::vector<int> subVec(start,end); // 创建由原集合中第三位直到第五位组成的副版
相关推荐

















