1

给定一个指向 s 的指针容器int,如何在int不使用*循环体中的取消引用运算符的情况下增加 s {}

这是在循环体中使用取消引用运算符的实现:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    int x = 0, y = 1, z = 2;

    auto increment_elements = [](vector<int*>& v) {
        for (auto& i : v) { ++*i };
    };

    increment_elements(vector<int*>{&x, &y, &z});

    cout << x << ", " << y << ", " << z << endl;
}

更换

for (auto& i : v) { ++*i };

for (int& i : v) { ++i };

给 MSVC-2013

error C2440: 'initializing' : cannot convert from 'int *' to 'int &'.

为什么替换为

for (auto& i : v) { ++i };

编译但不增加ints,它在做什么?

我对替换有同样的问题

for (int*& i : v) ++i;

这给出了相同的结果。

4

2 回答 2

1

给定一个指向整数的指针容器,如何在不使用*循环体中的取消引用运算符的情况下增加整数{}

尽可能在指针上使用引用。您不能制作引用类型的向量,因此您可以使用std::reference_wrapper<int>.

std::vector<std::reference_wrapper<int>> v{x, y, z};

increment_elements可能还应该采取一个范围来与通用编程保持一致。然后get()在元素上使用并增加它们:

template<class Iter>
void increment_elements(Iter first, Iter last)
{
    for (; first != last; ++first->get(), ++first);
}

然后你可以使用begin()and调用它end()

increment_elements(std::begin(v), std::end(v));

或者,如果您仍想将向量作为参数,则可以迭代并递增:

for (int& i : v) ++i;

并将其称为:

increment_elements(v);

为什么用 [...] 替换编译但不增加整数,它在做什么?

auto推导出元素类型,就像你上一个例子int*一样decltype(i)int*&

于 2014-08-09T01:20:19.780 回答
0

你的向量是vector<int *>不是vector<int>

vector<int *> &v;
for (auto &i : v)
    ++(*i);

v是 的向量int *。所以,类型iint* &。因此,您应该使用++(*i);增加x和。yz

for (int &i : v)
    ++i;

这是错误的。v是 的向量int *,但您正试图分配int *int &

for (auto &i : v)
    ++i;

此代码是增加指针,而不是x, y, z。因为它等于

for (std::vector<int *>::iterator it = v.begin(); it != v.end(); ++it)
    ++(*it);
于 2014-08-09T01:18:40.433 回答