在整个网络上,代码示例都有如下所示的for循环:
for(int i = 0; i < 5; i++)
Run Code Online (Sandbox Code Playgroud)
我使用以下格式:
for(int i = 0; i != 5; ++i)
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我认为它更有效率,但这在大多数情况下真的很重要吗?
谁能帮助我了解是否有一个很大的区别!=,并<当谈到谈论内矢量迭代for循环?
我的意思是,无论你使用!=和<,结果应该是一样的吗?
for (vector<int>::iterator i = vec.begin(); i != vec.end(); i++)
// DO STUFF
Run Code Online (Sandbox Code Playgroud)
for (vector<int>::iterator i = vec.begin(); i < vec.end(); i++)
// DO STUFF
Run Code Online (Sandbox Code Playgroud)
我知道最常用的方法是使用!=,但<如果使用会是一个大问题吗?
显然,取消引用无效指针会导致未定义的行为.但是如果只是在指针变量中存储无效的内存地址呢?
请考虑以下代码:
const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }
Run Code Online (Sandbox Code Playgroud)
表达式begin - 1求值为无效的内存地址.请注意,我们实际上并没有取消引用此地址 - 我们只是在指针算法中使用它来测试它是否有效.尽管如此,我们仍然需要将无效的内存地址加载到寄存器中.
那么,这是不确定的行为吗?我从来没有想过,因为很多指针算法似乎依赖于这种事情,而指针实际上只是一个整数.但最近我听说即使将无效指针加载到寄存器中的行为也是未定义的行为,因为某些架构会自动抛出总线错误或者其他内容.任何人都可以向我指出C或C++标准的相关部分,无论哪种方式解决这个问题?
我被问到这个问题我不知道为什么.
如果你有一个指针int * x;
可以比拟的指针>和<,因为它代表的内存位置类似0x0000 0x0004 0x0008,等我知道迭代器和指针是不同的,但他们以非常相似的方式行事.
例如:
vector<int> myVector;
for(int i = 1; i < 101; i++)
{
myVector.push_back(i);
}
vector<int>::iterator it = myVector.begin();
while(it != myVector.end()) //Why can't we write it < myVector.end()
{
cout << *it << endl;
it++;
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能< myVector.end()在while声明中写出来?我知道这与STL中没有超载有关.然而,写作是&*it < &*myVector.end()有效的,因为它获得了显示说话的内存位置0x0004 0x0008等.
为什么是这样?
每当我通过指针算法迭代 C++ 数组时(即不使用 Java 风格的索引递增),我首先获取数组中最后一个元素的地址,然后只要当前地址不是最后一个地址就进行迭代:
#include <iostream>
using namespace std;
int main()
{
int values[] = { 1, 2, 3, 4, 5 };
int* lastAddress = values + size(values);
for (int *p=values; p != lastAddress; p++) {
cout << "val: " << *p << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这是做这种事情的普遍接受的方式吗?
我有一个vector<int>::iterator和一个vector<int>::reverse_iterator如图所示:
vector<int>::iterator start = array.begin();
vector<int>::reverse_iterator end = array.rend();
while (true)
{
if (*start == *end && start <= end)
{
start++;
end++;
}
}
Run Code Online (Sandbox Code Playgroud)
在 while 循环中,我必须检查 start 和 end 处的值是否相等以及 start 没有越过 end。这样做start <= end是给我错误。有人可以指导我通过正确的方法吗?
错误:
开始 <= 结束。二元运算符 '<=' 不能应用于 vector::iterator 和 reverse_iterator 类型的表达式。