C++中std::vector<int> 和 std::vector 之间的区别
std::vector<int> 和 std::vector 是两个不同的类型,它们的区别在于模板参数的不同。
std::vector 是一个模板类,可以用来创建任意类型的动态数组容器。例如,std::vector<int> 是一个存储 int 类型元素的动态数组容器,std::vector<double> 是一个存储 double 类型元素的动态数组容器,以此类推。
而 std::vector<int> 则是一个具体类型的容器,它只能存储 int 类型的元素,不能存储其他类型的元素。因此,如果需要存储其他类型的元素,就需要使用相应类型的 std::vector。
例如,下面的代码示例创建了一个 std::vector<int> 类型的容器,并向其中添加了一些整数元素:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec { 1, 2, 3, 4, 5 };
for (auto& elem : vec) {
std::cout << elem << " ";
}
return 0;
}输出结果为:
1 2 3 4 5
这个例子中,我们创建了一个 std::vector<int> 容器,并通过花括号语法初始化了容器中的元素。然后我们使用一个范围 for 循环遍历容器中的元素,并将其输出到标准输出流中。
再举一个例子,下面的代码示例创建了一个 std::vector<std::string> 类型的容器,并向其中添加了一些字符串元素:
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec { "hello", "world", "!" };
for (auto& elem : vec) {
std::cout << elem << " ";
}
return 0;
}输出结果为:
hello world !
这个例子中,我们创建了一个 std::vector<std::string> 容器,并通过花括号语法初始化了容器中的元素。然后我们使用一个范围 for 循环遍历容器中的元素,并将其输出到标准输出流中。
总之,std::vector<int> 和 std::vector 的区别在于前者是一个特定类型的容器,只能存储 int 类型的元素;而后者是一个通用的模板类,可以用来创建存储任意类型元素的容器。
for (auto& elem : vec) 是 C++11 引入的一种新的 for 循环语法,也被称为范围 for 循环(range-based for loop)。它可以用来遍历一个序列(如数组、容器等)中的元素。
语法格式如下:
for (range_declaration : range_expression) {
// 循环体
}其中 range_expression 是一个表达式,代表要遍历的序列,例如数组、容器等。range_declaration 是一个变量声明,用来接收序列中的每个元素。在上面的例子中,range_declaration 是 auto& elem,表示声明了一个引用类型的变量 elem 来接收序列中的每个元素。
使用范围 for 循环遍历容器时,每次迭代会自动将容器中的下一个元素赋值给 elem 变量,直到遍历完整个容器。这样就可以避免使用迭代器或者下标操作来访问容器中的元素,使代码更加简洁易读。
需要注意的是,range_expression 表达式的类型必须支持迭代器访问,才能够使用范围 for 循环来遍历。 std::vector 是一个支持迭代器访问的容器,因此可以使用范围 for 循环来遍历其中的元素。
上面的例子中,auto& 声明的变量 elem 是一个引用类型的变量,这样在循环体内对 elem 进行修改时,实际上就是对容器中对应的元素进行修改。如果使用 auto 声明变量,则 elem 将是一个拷贝,对其进行修改并不会对容器中的元素产生影响。
因此,使用 auto& 声明变量可以避免不必要的内存拷贝,提高代码效率。

- 上一篇:C++中STL中的迭代器
- 下一篇:C++连接MySQL 表并操作
