Итерировать матрицу векторов с помощью c ++ с автоматическим диапазоном и структурированной привязкой? - PullRequest
0 голосов
/ 30 мая 2020

Я хочу сделать что-то вроде этого:

vector<vector<int>>& matrix; -> [[1, 1], [2, 2]]

for (auto [a, b] : matrix) {
    ...
}

Это не будет компилироваться для меня. Это правильный способ сделать это? Если нет, то почему?

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Вы можете использовать структурированную привязку только для хранилища, расположение которого можно определить во время компиляции, т.е. привязать его к массиву или хранилищу, подобному классу. Хранилище данных вектора - это динамическое c, вы не можете привязаться к его содержимому, состоящему из смежных элементов. Вы можете привязать этот список к элементам существующего типа, например, если вектор содержит пару, кортеж или любую подобную структуру.

#include <string>
#include <vector>
#include <tuple>
#include <iostream>

int main()
{
   std::vector<std::tuple<int,int, std::string>> 
                            v  = {{1,3,"aa"},{3,5,"bb"}};
    
   for(auto& [a,b,s] : v)
   {
       std::cout << a << b << s << std::endl;
   }
   return 0;
}
0 голосов
/ 30 мая 2020

Вышеупомянутый подход действителен только для перебора карты в C ++. Если d - неупорядоченная карта, то ее можно повторить с помощью приведенного ниже кода

for(auto& [a,b] : d)
{
    count<< "First" << a.first << "Second" << a.second <<endl;
}

Чтобы перебрать матрицу vector>, так как в этом случае можно использовать приведенный ниже код,

vector<vector<int>> mat = { {1,1},{2,2} };
for (auto& a : mat) {
  for (auto& b : a) {
    cout << b << " ";
  }
  cout <<endl;
}
...