当前位置:首页 其他 > 正文

C++中std::vector<int> 和 std::vector 之间的区别

作者:野牛程序员:2023-02-28 08:00:57 其他阅读 2847

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_declarationauto& elem,表示声明了一个引用类型的变量 elem 来接收序列中的每个元素。

使用范围 for 循环遍历容器时,每次迭代会自动将容器中的下一个元素赋值给 elem 变量,直到遍历完整个容器。这样就可以避免使用迭代器或者下标操作来访问容器中的元素,使代码更加简洁易读。

需要注意的是,range_expression 表达式的类型必须支持迭代器访问,才能够使用范围 for 循环来遍历。 std::vector 是一个支持迭代器访问的容器,因此可以使用范围 for 循环来遍历其中的元素。

上面的例子中,auto& 声明的变量 elem 是一个引用类型的变量,这样在循环体内对 elem 进行修改时,实际上就是对容器中对应的元素进行修改。如果使用 auto 声明变量,则 elem 将是一个拷贝,对其进行修改并不会对容器中的元素产生影响。

因此,使用 auto& 声明变量可以避免不必要的内存拷贝,提高代码效率。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击