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 表并操作