我有载体列表:
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 :(得分: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];
}