2015-12-18 2 views
-4

У меня есть зЬй :: вектор, как описано ниже:Итерация над вектором с использованием первого значения станд :: пары только

std::vector<std::pair<int, const char*>> matrix; 

Этот вектор имеет следующие значения (например, для): values (as an example)

Эти значения могут быть доступ здесь следующим образом:

matrix[0] = [0,Hello] // pseudo code (only showing values inside) 

matrix[1] = [0,Fox] // pseudo code (only showing values inside) 

matrix[2] = [1,Red] // pseudo code (only showing values inside) 

Я Перебор содержимого вектора читать значения, делая это:

for (std::vector<std::pair<int, const char*>>::iterator it = matrix.begin(); it != matrix.end(); ++it) 
    { 
     std::pair<int, const char*> v_temp = *it; 
     std::cout << v_temp.first; 
     std::cout << v_temp.second; 
    } 

Теперь, что это делает, выполняется итерация от первого элемента вектора до конечного элемента вектора. То, что я хочу сделать, является итерацией только для первых элементов (т. Е. Значений int). Итак, из прилагаемого табличного изображения этот текущий код будет зацикливаться на [row x column] [9 x 2] = 18 раз. Я хочу, чтобы он для этого повторял только 9 раз [строк] и не учитывал столбцы в целом.

Как я могу это сделать?

+0

Вы пробовали устраняя строки 'зЬй :: COUT << v_temp.second;'? – Yakk

+0

Возможно, вам захочется узнать, как использовать инструмент [debugger] (https://en.wikipedia.org/wiki/Debugger), чтобы лучше понять поток управления вашими программами. – Drop

ответ

0

Ваша петля итерации по строкам матрицы. Элемент i из matrix является «строка» на индексе i (в данном случае в std::pair<int, const char*> Так что, если вы отодвинули 9 пар, то цикл будет перебирать 9 раз

FYI:.. Вы можете упростить код, используя C++ featureauto :

for(auto it = matrix.begin(); it != matrix.end(); ++it){ 
    auto v_temp = *it; 
    std::cout << v_temp.first; 
    std::cout << v_temp.second; 
} 

дальнейшее упрощение

for(const auto& v_temp : matrix) 
{ 
    std::cout << v_temp.first; 
    // ... 
} 

Вы можете использовать с ++ для 11-диапазона на основе цикла для любого объекта, на котором компилятор может ча ll begin() и end() on.

+0

Вы можете упростить его с помощью 'for (auto & v_temp: matrix) {...} ' – Kevin

+0

@Kevin Действительно! Я добавлю это к ответу. – jensa

0

Есть много способов кожи этого конкретного кота. Можно было бы использовать std::transform:

std::transform(v.begin(), v.end(), 
    std::ostream_iterator<int>(std::cout, "\t"), 
    [](auto const &p) { return p.first; });