相关疑难解决方法(0)

在'for'循环中递增1时格式化的技术原因?

在整个网络上,代码示例都有如下所示的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)

我这样做是因为我认为它更有效率,但这在大多数情况下真的很重要吗?

c c# c++ java for-loop

53
推荐指数
10
解决办法
6003
查看次数

矢量迭代器<或!=

谁能帮助我了解是否有一个很大的区别!=,并<当谈到谈论内矢量迭代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)

我知道最常用的方法是使用!=,但<如果使用会是一个大问题吗?

c++ iterator vector

30
推荐指数
3
解决办法
2494
查看次数

是否存储无效指针自动未定义的行为?

显然,取消引用无效指针会导致未定义的行为.但是如果只是在指针变量中存储无效的内存地址呢?

请考虑以下代码:

const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }
Run Code Online (Sandbox Code Playgroud)

表达式begin - 1求值为无效的内存地址.请注意,我们实际上并没有取消引用此地址 - 我们只是在指针算法中使用它来测试它是否有效.尽管如此,我们仍然需要将无效的内存地址加载到寄存器中.

那么,这是不确定的行为吗?我从来没有想过,因为很多指针算法似乎依赖于这种事情,而指针实际上只是一个整数.但最近我听说即使将无效指针加载到寄存器中的行为也是未定义的行为,因为某些架构会自动抛出总线错误或者其他内容.任何人都可以向我指出C或C++标准的相关部分,无论哪种方式解决这个问题?

c c++ pointers

18
推荐指数
3
解决办法
1662
查看次数

在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++ syntax iterator loops idiomatic

9
推荐指数
1
解决办法
971
查看次数

有没有一种方法可以遍历 C++ 数组而无需从一开始就知道结束地址?

每当我通过指针算法迭代 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)

这是做这种事情的普遍接受的方式吗?

c++ arrays

3
推荐指数
1
解决办法
114
查看次数

检查反向迭代器是否已经越过正向迭代器

我有一个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 类型的表达式。

c++

2
推荐指数
1
解决办法
1903
查看次数

标签 统计

c++ ×6

c ×2

iterator ×2

arrays ×1

c# ×1

for-loop ×1

idiomatic ×1

java ×1

loops ×1

pointers ×1

syntax ×1

vector ×1