迭代器(向量或字符串)减去 n (iter - n) for c++
Iterator(of a vector or string) minus n (iter - n) for c++
我的问题的一些详细描述:
- 在 C++ 11 中创建向量或字符串的迭代器。
- 做迭代器运算,迭代器减n
问题:C++ 11 会保持迭代器负 n 大于 begin() 吗? (如果n足够大,编译器会保证iter-n不超过iterator的合法范围吗?)
根据 cppreference,iter - n
实际上等同于:
vector<T>::iterator temp = iter;
while(n--) --temp;
return temp;
假设 iter
是来自名为 container
的 vector
的迭代器。如果 n
大于 distance(container.begin(), iter)
,那么在最后一个 while
循环的某个时刻,--temp
将等同于:
--container.begin();
并且根据 cppreference,该行将是未定义的行为。
由于迭代器无法获知起源容器的任何信息,因此无法检测当前是否为container.begin()
,因此如果不手动检查则无法确保其保持在合法范围内反对范围。
不,迭代器算法不会对结果进行任何边界检查。您很容易得到一个无效的迭代器。
std::vector
给出的随机访问迭代器将允许您进行减法,因此您可以实施自己的边界检查。
it2 = it - min(n, it - container.begin());
它不会,它只会执行算术运算并打印负数的值。
使用 VSCode 执行代码。
#include<conio.h>
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {1,2,3,4,5,6};
vector<int> :: iterator it;
for(it=v.begin();it!=v.end();it++)
cout<<*it-6<<endl;
return 0;
}
结果是:
-5
-4
-3
-2
-1
0
我的问题的一些详细描述:
- 在 C++ 11 中创建向量或字符串的迭代器。
- 做迭代器运算,迭代器减n
问题:C++ 11 会保持迭代器负 n 大于 begin() 吗? (如果n足够大,编译器会保证iter-n不超过iterator的合法范围吗?)
根据 cppreference,iter - n
实际上等同于:
vector<T>::iterator temp = iter;
while(n--) --temp;
return temp;
假设 iter
是来自名为 container
的 vector
的迭代器。如果 n
大于 distance(container.begin(), iter)
,那么在最后一个 while
循环的某个时刻,--temp
将等同于:
--container.begin();
并且根据 cppreference,该行将是未定义的行为。
由于迭代器无法获知起源容器的任何信息,因此无法检测当前是否为container.begin()
,因此如果不手动检查则无法确保其保持在合法范围内反对范围。
不,迭代器算法不会对结果进行任何边界检查。您很容易得到一个无效的迭代器。
std::vector
给出的随机访问迭代器将允许您进行减法,因此您可以实施自己的边界检查。
it2 = it - min(n, it - container.begin());
它不会,它只会执行算术运算并打印负数的值。
使用 VSCode 执行代码。
#include<conio.h>
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {1,2,3,4,5,6};
vector<int> :: iterator it;
for(it=v.begin();it!=v.end();it++)
cout<<*it-6<<endl;
return 0;
}
结果是:
-5
-4
-3
-2
-1
0