Как можно избежать использования автоматического спецификатора в циклах для диапазонов? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь использовать автоматический спецификатор в следующем l oop

for (auto x : graf[nod])
{
    if (cost + x.second < dist[x.first])
    {
        dist[x.first] = cost+x.second;
        pq.push(make_pair(x.first, dist[x.first]));
    }
}

, где graf - это вектор пар, и кажется, что он не работает в C ++ 98, и я делаю не знаю, как превратить его в более привычный вид l oop. Есть ли способ избежать этого?

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Вы можете превратить C ++ 11

for (auto x : graf[nod])

в C ++ 03

for (std::size_t i = 0; i != graf[nod].size(); ++i) {
    std::pair<T1, T2> x = graf[nod][i];
    // ...
}

0 голосов
/ 04 марта 2020

Диапазон не волшебный c. Он имеет определение :

for ( init-statement(optional)range_declaration : range_expression ) loop_statement

Значения

{
  init - statement 
  auto&& __range = range_expression;
  auto __begin = begin_expr;
  auto __end = end_expr;
  for (; __begin != __end; ++__begin) {
    range_declaration = *__begin;
    loop_statement
  }
}

auto тоже не маги c. Это просто заполнитель для фактического типа.

Сказав это, вы можете использовать cppinsights.io , чтобы перевести некоторые ярлыки в современном C ++ в более традиционные концепции. Например. Это:

#include <utility>
#include <vector>

int main() {
  std::vector<std::vector<std::pair<int, int>>> graf;

  // fill graf

  for (auto x : graf[0]) {
    x.first += x.second;
  }
}

Переводит на :

#include <utility>
#include <vector>

int main()
{
  std::vector<std::vector<std::pair<int, int> > > graf = std::vector<std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >, std::allocator<std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > > >();
  {
    std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > & __range1 = graf.operator[](0);
    std::__wrap_iter<std::pair<int, int> *> __begin1 = __range1.begin();
    std::__wrap_iter<std::pair<int, int> *> __end1 = __range1.end();
    for(; std::operator!=(__begin1, __end1); __begin1.operator++()) 
    {
      std::pair<int, int> x = std::pair<int, int>(__begin1.operator*());
      x.first += x.second;
    }

  }
}

std::__wrap_iter - это деталь реализации, но кроме этого очень ясно, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...