手机网站做桌面快捷方式,怎么改网站内容,怎样做好竞价推广,什么是网站开发公司电话C之STL整理#xff08;2#xff09;之vector用法#xff08;创建、赋值、方法#xff09;整理 注#xff1a;整理一些突然学到的C知识#xff0c;随时mark一下 例如#xff1a;忘记的关键字用法#xff0c;新关键字#xff0c;新数据结构 C 的vector用法整理 C之STL整…C之STL整理2之vector用法创建、赋值、方法整理 注整理一些突然学到的C知识随时mark一下 例如忘记的关键字用法新关键字新数据结构 C 的vector用法整理 C之STL整理2之vector用法创建、赋值、方法整理一、vector的初始化1、默认构造函数2、拷贝构造函数copy区间3、指定数量和元素值的构造函数4、指定数量的构造函数5、拷贝构造函数 二、vector的初始化-赋值1、.assign(beg, end) 赋值操作2、.assign(n, elem) 赋值操作3、重载等号操作符 operator4、直接列表初始化 VectorT {,};5、swap 函数 三、数据得增删查改1、at(int id)接口2、front()接口3、back()接口4、[id]直接取5、插入函数6、尾部添加 push_back(ele)7、尾部删去 pop_back()8、删区间9、删指定位置10、清空 四、其他接口1、size()成员函数2、empty()3、resize(int num)4、capacity()5、reserve(int len) 总结 提示本文为 C 中 vector构造、赋值、接口 的写法和举例 一、vector的初始化 根据vector的以下封装好的构造函数现在示例每种构造方式的创建
vector构造函数vectorT v; //默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素copy给对象。
vector(n, elem);//构造函数将n个elem赋给对象。
vector(n);//构造函数将n个0或空赋值给对象。
vector(const vector vec);//拷贝构造函数。1、默认构造函数
创建一个空的vector。
#include iostream
#include vector int main() { std::vectorint v; // 创建一个空的vector std::cout Size of vector v: v.size() std::endl; // 输出Size of vector v: 0 return 0;
}2、拷贝构造函数copy区间
假设有一个已存在的vector我们想要创建一个新的vector并拷贝其中一部分元素。
#include iostream
#include vector int main() { std::vectorint v {1, 2, 3, 4, 5}; std::vectorint v2(v.begin(), v.begin() 3); // 拷贝前3个元素 for (int num : v2) { std::cout num ; // 输出1 2 3 } std::cout std::endl; return 0;
}3、指定数量和元素值的构造函数
创建一个包含特定数量且所有元素都具有相同值的vector。
#include iostream
#include vector int main() { std::vectorint v(5, 10); // 创建一个包含5个10的vector for (int num : v) { std::cout num ; // 输出10 10 10 10 10 } std::cout std::endl; return 0;
}4、指定数量的构造函数
创建一个包含特定数量的vector所有元素默认初始化为该类型的默认值对于基本类型如int默认值为0。
#include iostream
#include vector int main() { std::vectorint v(5); // 创建一个包含5个0的vector for (int num : v) { std::cout num ; // 输出0 0 0 0 0 } std::cout std::endl; return 0;
}5、拷贝构造函数
从另一个已存在的vector创建一个新的vector作为它的拷贝。
#include iostream
#include vector int main() { std::vectorint v {1, 2, 3, 4, 5}; std::vectorint v2(v); // 使用拷贝构造函数创建v2它是v的拷贝 for (int num : v2) { std::cout num ; // 输出1 2 3 4 5 } std::cout std::endl; return 0;
}二、vector的初始化-赋值
vector常用赋值方式
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值。
assign(n, elem);//将n个elem拷贝赋值。
vector operator(const vector vec);//重载
VectorT {,,,};//直接赋值一个数组
VectorT {,,,};
swap(vec);// 与vec的元素互换。1、.assign(beg, end) 赋值操作
使用区间迭代器将另一个容器或数组中的数据拷贝到vector中。
#include iostream
#include vector
#include algorithm // for std::next int main() { std::vectorint v {1, 2, 3, 4, 5}; int arr[] {6, 7, 8, 9, 10}; v.assign(std::begin(arr), std::end(arr)); // 赋值arr数组到v for (int num : v) { std::cout num ; // 输出6 7 8 9 10 } std::cout std::endl; return 0;
}2、.assign(n, elem) 赋值操作
将n个值为elem的元素拷贝到vector中。
#include iostream
#include vector int main() { std::vectorint v; v.assign(5, 10); // 赋值5个10到v for (int num : v) { std::cout num ; // 输出10 10 10 10 10 } std::cout std::endl; return 0;
}3、重载等号操作符 operator
使用重载的等号操作符将一个vector的内容赋给另一个vector。
#include iostream
#include vector int main() { std::vectorint v1 {1, 2, 3, 4, 5}; std::vectorint v2; v2 v1; // 使用重载的等号操作符赋值v1到v2 for (int num : v2) { std::cout num ; // 输出1 2 3 4 5 } std::cout std::endl; return 0;
}4、直接列表初始化 VectorT {,};
在创建vector对象时直接使用列表初始化语法。
#include iostream
#include vector int main() { std::vectorint v {21, 22, 23, 24, 25}; // 直接列表初始化 for (int num : v) { std::cout num ; // 输出21 22 23 24 25 } std::cout std::endl; return 0;
}5、swap 函数
使用std::swap或vector的成员函数swap来交换两个vector的内容。
#include iostream
#include vector
#include algorithm // for std::swap int main() { std::vectorint v1 {1, 2, 3}; std::vectorint v2 {4, 5, 6}; std::swap(v1, v2); // 使用std::swap交换v1和v2的内容 // 输出交换后的v1 for (int num : v1) { std::cout num ; }std::cout std::endl; return 0;
}三、数据得增删查改
vector数据存取操作主要有at()、front()、back()接口和括号[]取得方法。 vector插入和删除操作主要有insert、erase、clear、pushback、popback接口。
1、at(int id)接口
at成员函数用于通过索引访问元素并且在索引越界时会抛出std::out_of_range异常。
#include iostream
#include vector
#include stdexcept // for std::out_of_range int main() { std::vectorint v {10, 20, 30, 40, 50}; try { std::cout v.at(2) std::endl; // 输出30 std::cout v.at(10) std::endl; // 抛出std::out_of_range异常 } catch (const std::out_of_range e) { std::cerr Index out of range: e.what() std::endl; } return 0;
}2、front()接口
front成员函数返回容器中第一个元素的引用。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40, 50}; std::cout v.front() std::endl; // 输出10 return 0;
}3、back()接口
back成员函数返回容器中最后一个元素的引用。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40, 50}; std::cout v.back() std::endl; // 输出50 return 0;
}4、[id]直接取
operator[]通过索引直接访问元素如果越界行为是未定义的通常会导致程序崩溃。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40, 50}; std::cout v[2] std::endl; // 输出30 // std::cout v[10] std::endl; // 未定义行为通常会导致程序崩溃 return 0;
}5、插入函数
insert(const_iterator pos, int count, ele)在迭代器pos指向的位置插入count个值为ele的元素。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 40, 50}; v.insert(v.begin() 1, 2, 30); // 在索引1的位置插入2个30 for (int num : v) { std::cout num ; // 输出10 30 30 20 40 50 } std::cout std::endl; return 0;
}6、尾部添加 push_back(ele)
在容器的尾部插入一个元素ele。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30}; v.push_back(40); // 在尾部插入40 for (int num : v) { std::cout num ; // 输出10 20 30 40 } std::cout std::endl; return 0;
}7、尾部删去 pop_back()
删去容器的最后一个元素。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40};v.pop_back(); // 删除最后一个元素40 for (int num : v) { std::cout num ; // 输出10 20 30 } std::cout std::endl; return 0;
}8、删区间
erase(const_iterator start, const_iterator end)删去从迭代器start到end不包括end之间的所有元素。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40, 50}; v.erase(v.begin() 1, v.begin() 3); // 删除索引1到2之间的元素即20和30 for (int num : v) { std::cout num ; // 输出10 40 50 } std::cout std::endl; return 0;
}9、删指定位置
erase(const_iterator pos)删除迭代器pos指向的元素。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40, 50}; v.erase(v.begin() 2); // 删除索引2的元素即30 for (int num : v) { std::cout num ; // 输出10 20 40 50 } std::cout std::endl; return 0;
}10、清空
clear()删掉容器中的所有元素。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40, 50}; v.clear(); // 删除所有元素 if (v.empty()) { std::cout Vector is empty. std::endl; // 输出Vector is empty. } return 0;
}这些操作提供了对vector容器内容的灵活操作可以轻松地插入和删除元素以满足程序的需要。使用迭代器或索引时请确保它们指向有效的容器位置以避免未定义行为或异常。
四、其他接口
1、size()成员函数
返回容器中的元素个数。这个数量等于当前vector实际包含的元素数。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30, 40, 50}; std::cout Size of vector: v.size() std::endl; // 输出Size of vector: 5 return 0;
}2、empty()
empty成员函数检查容器是否为空。如果容器中没有元素它返回true否则返回false。
#include iostream
#include vector int main() { std::vectorint v; if (v.empty()) { std::cout Vector is empty. std::endl; // 输出Vector is empty. } else { std::cout Vector is not empty. std::endl; } return 0;
}3、resize(int num)
resize成员函数用于改变容器的大小。如果新的大小num大于当前大小则容器会增长新添加的元素会被初始化为默认值对于内置类型通常是0。如果num小于当前大小则末尾超出的元素会被删除。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30}; v.resize(5); // 容器增长新元素初始化为0 for (int num : v) { std::cout num ; // 输出10 20 30 0 0 } std::cout std::endl; v.resize(2); // 容器缩短超出的元素被删除 for (int num : v) { std::cout num ; // 输出10 20 } std::cout std::endl; return 0;
}resize(int num, elem) 是resize的另一种重载形式。它允许你为新的元素指定一个初始值elem。如果容器增长新添加的元素会被初始化为elem。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30}; v.resize(5, 42); // 容器增长新元素初始化为42 for (int num : v) { std::cout num ; // 输出10 20 30 42 42 } std::cout std::endl; return 0;
}4、capacity()
capacity成员函数返回容器当前分配的存储空间大小。这通常大于或等于size返回的值因为vector为了效率可能会预留一些额外的空间。
#include iostream
#include vector int main() { std::vectorint v {10, 20, 30}; std::cout Size: v.size() , Capacity: v.capacity() std::endl; // 输出可能类似于Size: 3, Capacity: 3 或 Size: 3, Capacity: 4取决于实现 return 0;
}5、reserve(int len)
reserve成员函数用于预分配容器的存储空间。它并不改变容器的大小即size的值不变但会增加容器的capacity。预分配空间可以提高插入元素的效率因为当容器需要增长时它可能不需要重新分配整个存储空间。reserve成员函数用于预分配容器的存储空间它可以帮助提高插入元素的效率因为当容器需要增长时如果已经有足够的预留空间它就可以避免重新分配整个存储空间。
这里是一个更详细的例子展示了如何使用reserve来预分配vector的存储空间
#include iostream
#include vector int main() { std::vectorint v; // 初始时size和capacity都是0 std::cout Initial size: v.size() , Initial capacity: v.capacity() std::endl; // 使用reserve预分配至少10个元素的存储空间 v.reserve(10); // size仍然是0因为我们没有添加任何元素 // 但capacity至少为10 std::cout After reserve, size: v.size() , Capacity: v.capacity() std::endl; // 添加元素直到达到或超过预留的capacity for (int i 0; i 15; i) { v.push_back(i); } // size现在是15因为我们添加了15个元素 // capacity可能已经增长以容纳更多的元素 std::cout After adding elements, size: v.size() , Capacity: v.capacity() std::endl; return 0;
}输出可能类似于
Initial size: 0, Initial capacity: 0
After reserve, size: 0, Capacity: 10
After adding elements, size: 15, Capacity: 20 (或更大取决于实现)capacity的确切值可能因不同的vector实现而异。在上面的例子中当添加超过预留capacity的元素时vector可能会再次分配内存并可能增加其capacity。这样做是为了避免在每次添加元素时都重新分配内存从而提高性能。在实践中如果你知道将要向vector中添加大量元素使用reserve来预分配足够的空间通常是一个好习惯因为这可以避免不必要的内存分配和元素复制。
总结