2014-09-29 46 views
-1

比方说,我有一个二维数组:迭代器只有一排的向量的向量的

vector<vector<int8_t>> table = 
{ 
    {0, 1, 2, 3, 4, 5 }, 
    {22, 46, 12, 2, 35, 4 }, 
    {4, 5, 6, 22, 11, 8 }, 

}; 

如何搜索只有一排特定元素。我试图使用迭代器,但如何告诉他们在一行的开始处开始?

因此,我总是知道要搜索哪一行,以便不需要进入循环。

例如搜索元件12的第1行。

+0

'它 - >开始()'和'它 - >结束( )'也许? – 101010 2014-09-29 07:16:42

+0

这将搜索整个数组。 – user1876942 2014-09-29 07:35:57

+0

不,它不会。由于'it'指向外部向量的向量。 – 101010 2014-09-29 07:38:34

回答

2

您可以编写一个通用函数。例如

size_t find_element(const std::vector<std::vector<int>> &v, 
        std::vector<std::vector<int>>::size_type n, 
        int value) 
{ 
    if (v.size() <= n) return -1; 

    auto it = std::find(v[n].begin(), v[n].end(), value); 

    return it == v[n].end() ? -1 : std::distance(v[n].begin(), it); 
} 

或者你可以把一个模板函数,而不是typename std::vector<std::vector<T>>::size_type n

template <class T> 

size_t find_element(const std::vector<std::vector<T>> &v, 
        typename std::vector<std::vector<T>>::size_type n, 
        const T &value) 
{ 
    if (v.size() <= n) return -1; 

    auto it = std::find(v[n].begin(), v[n].end(), value); 

    return it == v[n].end() ? -1 : std::distance(v[n].begin(), it); 
} 

你可以使用简单的size_t n

+0

有无论如何得到一个更普遍的功能,所以对于int8_t,int16_t等..总之,这看起来像一个非常好的解决方案。谢谢。 – user1876942 2014-09-29 08:03:52

+0

@ user1876942您可以简单地使我显示模板的功能。看到我更新的帖子。 – 2014-09-29 08:08:59

1

对待每一行像其他矢量一样。

auto row_beg = table[1].begin(); 
auto row_end = table[1].end(); 
auto find_it = std::find(row_beg, row_end, 12); 
if (find_it != row_end) 
    std::cout << "Found.\n"; 
+0

谢谢,有无论如何知道什么时候发现了物品,例子12在元素3找到然后中断? – user1876942 2014-09-29 07:34:10

+0

@ user1876942你的意思是获得索引?你可以尝试'find_it - row_beg'或者'std :: distance(row_beg,find_it)'。 – 2014-09-29 07:39:15

2
auto it = std::search(table[row_index].begin(),table[row_index].end(),value);