C ++:访问向量列表

时间:2015-10-27 10:00:45

标签: c++ list vector

我有载体列表:

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;
}

3 个答案:

答案 0 :(得分:3)

Cássio在评论中提供的解决方案将无效,因为您无法随机访问 // jscs:disable /* jshint ignore:start */ // mixpanel script /* jshint ignore:end */ // jscs:enable 的元素

相反,您可以使用标头list中定义的std::next来执行此操作:

<iterator>

请注意,此方法不会对传入的列表大小执行任何边界检查。在返回此值之前,应检查return std::next(myList.begin(), i)->at(j); 是否为有效索引。

答案 1 :(得分: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

注意函数的第一个参数是const引用。

对于你的函数,当其中一个索引超出有效范围时,它具有未定义的行为,因为该函数返回变量num的未初始化值。

答案 2 :(得分: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];
}