使用向量时,为什么我们有时会使用operator []像homework [mid],但有时候使用homework.begin()。另外,homework.end()不是作业[结束],但这就像开始。它只是以不同方式访问元素吗?这种方式更令人困惑,你不同意吗?
答案 0 :(得分:2)
vector :: operator []检索向量的第N个元素。这样的运算符仅为select STL容器类定义。
vector.end()是一个返回迭代器的方法。迭代器是用于处理STL容器的特殊实体,包括向量。 vector :: end()指向紧跟在向量的最后一个元素之后的元素 - 它通常被视为一个值来对比迭代器,以确定是否遍历了整个容器。
答案 1 :(得分:2)
这与C数组相同......
int [length_a]
“开始/结束”版本:
int* begin = a;
int* end = a+length_a;
while (p<e) {
printf("%d", *p);
++p;
}
注意“end”如何指向数组之外的一个元素!它与vector :: end完全相同(将其视为停止条件)。
“[]”版本:
for (int i=0; i<length_a; ++i) {
printf("%d", a[i]);
}
'[]'摘要:
+与C数组兼容,有效语法
- 不适用于非随机访问容器(例如:更改为“list”将很困难)
我的POV建议:
使用[]进行随机访问或作为“简单”升级到c数组
在顺序遍历整个内容时使用开始/结束
答案 2 :(得分:1)
begin()和end()是vector的成员函数,它返回一个迭代器。可以取消引用此迭代器以获取值。类似地,您有operator [],它接受索引并直接返回存储在该位置的值。
答案 3 :(得分:0)
他们做不同的事情。 operator[n]
返回引用对n
元素的引用。
begin()和end()返回指向容器开头和结尾的迭代器。如果你需要迭代容器,那么使用迭代器几乎不会“更加混乱”。它简单得多。
假设你有一个向量v:
std::vector<int> v;
v.push_back(1);
v.push_back(7);
v.push_back(42);
v.push_back(3);
如果您只想引用一个元素,您可以选择以下选项:
v[2];
*v.begin()+2;
所以在这里,operator[]
更简单。
但是如果你想迭代容器,也许要打印出内容,你有以下选择:
for (int i = 0; i < v.size(); ++i){
std::cout << v[i];
}
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout));
突然间,迭代器为我们节省了大量的工作。我们不再需要制作循环。
或者说你想找到最大的元素:
int max = 0;
for (int i = 0; i < v.size(); ++i){
if (v[i] > max) { max = v[i]; }
}
std::max_element(v.begin(), v.end());
或者您可能想要对矢量进行排序。我甚至不打算使用operator[]
编写自己的排序算法,但这里是迭代器版本:
std::sort(v.begin(), v.end());
这就是为什么begin(),end()很有用。