std::vector::front() 和 begin() 之间的区别
Difference between std::vector::front() and begin()
帮助vector
说front()
返回对矢量容器中第一个元素的引用。 与成员
vector::begin
不同,成员返回同一元素的迭代器,此>函数返回直接引用。
矢量上的帮助说begin()
返回引用矢量容器中第一个元素的迭代器。 请注意,与返回对第一个元素的引用的成员
vector::front
不同,此函数>返回随机访问迭代器。
这段代码输出:
char arr[] = { 'A', 'B', 'C' };
vector<char> vec(arr, arr+sizeof(arr));
cout << "address of vec.front() " << (void*)&vec.front() << endl;
cout << "address of vec.begin() " << (void*)&vec.begin() << endl;
vec.front() 00401F90
地址vec.begin() 0030F494
地址
我不明白"直接引用"是什么意思? 就begin()
而言,random access iterator
不就是pointer
吗?
有人可以指出区别吗?
根据Stroustrup在The C++ Programming Language,第16.3.3节; 将front()
视为第一个元素,begin()
视为指向第一个元素的指针。
在begin()的情况下,随机访问迭代器不只是一个指针吗?
不,迭代器有一些指针语义,但它实际上是一个类。
即使是这样,也应该回答这个问题。这就像问为什么指针的地址与它指向的对象的地址不同。
如果你取消引用迭代器,你会得到相同的值,这将给你第一个元素:
&(*vec.begin())
因为
*vec.begin() == vec.front()
对于向量,begin()
和 end()
返回随机访问迭代器。他们可能会返回一个普通指针;没关系,因为它满足成为随机访问迭代器的要求。特别是,您可以编写*begin()
以获取对序列中第一个对象的引用(假设有一个)。 front()
为您提供对序列中第一个对象的引用,而无需通过中间迭代器。喜欢这个:
vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front(); // j == 3
假设向量中至少有 1 个元素,
vec.front()
与
*vec.begin()
为了保持头脑清晰,请始终尝试记住以下两行,假设您有一个名为 v
的 STL 向量:
v.front() = * v.begin()
&&
v.back() = * v.end()
这意味着如果你有一个向量:
v = {1,2,3,4};
你有一个名为 IT 的迭代器,并且您想要访问第一个和最后一个元素您可以执行以下操作之一:
IT = v.begin();
std::cout<<*IT<<std::endl; // output : 1
IT = v.end();
std::cout<<*IT<<std::endl; // output : 4
或者您可以轻松执行此操作:
std::cout<<v.front<<std::endl; // output : 1
std::cout<<v.back<<std::endl; // output : 4
两者都将打印相同的输出,区别仅在于是否要使用迭代器。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?