2015-10-27 2 views
2

У меня есть список векторов:C++: Доступ определенный элемент в списке векторов

list< vector<int> > myList; 

Структура этого списка:

({1,2,3}, {4,5,6}, ...) 

Я хочу, чтобы получить определенный элемент его позиции. Например, getFromList(myList, 0, 2) вернет 3. Я попытался это, но он не работает:

int getFromList(list< vector<int> > myList, int i, int j) 
{ 
    int ki = 0, kj = 0, num; 
    for (list<vector<int>>::iterator it1 = myList.begin(); it1 != myList.end(); ++it1) { 
     vector<int>::iterator it2; 
     ki++; 
     for (it2 = (*it1).begin(); it2 != (*it1).end(); ++it2) { 
      kj++; 
      if (ki == i && kj == j) { 
       num = (*it2); 
      } 
     } 
    } 

    return num; 
} 
+0

Есть много ошибок, если я использую вашу команду, Cássio Ренан. Первая ошибка: 'Ошибка ошибка C2227: слева от '-> at' должна указывать на класс/struct/union/generic type' – Gooman

+0

@ CássioRenan' list' итератор, возвращаемый 'begin()', является двунаправленным итератором. Вам запрещено использовать 'operator +'. –

ответ

2

Вот демонстративного программу

#include <iostream> 
#include <list> 
#include <vector> 
#include <iterator> 
#include <stdexcept> 


int getFromList(const std::list<std::vector<int>> &myList, size_t i, size_t j) 
{ 
    if (!(i < myList.size())) throw std::out_of_range("The frst index is out of the range"); 

    auto it = std::next(myList.begin(), i); 

    if (!(j < it->size())) throw std::out_of_range("The second index is out of the range"); 

    return it->operator [](j); 
}  

int main() 
{ 
    std::list<std::vector<int>> myList = { { 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11, 12 } }; 

    std::cout << "myList[" << 2 << "][" << 3 << "] = " << getFromList(myList, 2, 3) << std::endl; 

    return 0; 
} 

Его выход

myList[2][3] = 11 

Обратите внимание, что первый параметр функции константной ссылке.

Что касается вашей функции, то она имеет неопределенное поведение, когда один из индексов выходит за допустимый диапазон, потому что функция возвращает неинициализированное значение переменной num.

+0

Есть ли причина, по которой вы делаете свое собственное исключение здесь для проверки второго индекса вместо того, чтобы полагаться на оценки, проверяющие, что 'vector :: at' будет делать? –

+1

@SimonGibbons Плохая идея, когда два броска несовместимы друг с другом. Один из них выдает сообщение с понятным пользователем четким сообщением и другие проблемы с системным сообщением. –

3

решения, Cássio при условии, в комментариях не будет работать, как вы не можете случайно получить доступ элементов list

Вместо этого вы можете использовать std::next определены в заголовок <iterator> сделать это следующим образом:

return std::next(myList.begin(), i)->at(j); 

Обратите внимание, что этот метод не делает каких-либо проверки границ от размера списка, который вы проходите в Перед возвращением этого вы должны проверить, что.- действительный индекс.

0

Я нашел решение по моему:

int getFromList(list< vector<int> > myList, int i, int j) 
{ 
    list<vector<int>>::iterator iter = myList.begin(); 
    advance(iter, i); 
    vector<int> x = (*iter); 

    return x[j]; 
} 
+0

Это нехорошее решение, потому что вы 1) передаете список по значению; 2) вы не проверяете допустимые диапазоны; 3) вы создаете вектор внутри функции. –

+0

Хорошо, Влад. В этом случае лучше использовать решение, предоставленное вами или Саймоном. – Gooman

+0

Его решение имеет неопределенное поведение. –

Смежные вопросы