map<int, vector<int> > my_map
。所以,例如它看起来如下,
my_map=
0 1 2 6 5 4
1 0 2 3 4 5
2 0 1 4
3 1
4 1 2 0 7 5 6
5 1 0 6 4
6 0 5 4
7 4
vector<int> element_common(map<int, vector<int> > &my_map, int s1, int s2){
vector<int> common2;
vector<int> first_vector=my_map[s1];
vector<int>::iterator snd_vector_begin= my_map[s2].begin();
vector<int>::iterator snd_vector_end= my_map[s2].end();
for (vector<int>::iterator any=first_vector.begin();
any!=first_vector.end();
any++){
// check if any is in other_list
vector<int>::iterator any_in_snd_vector_iterator= find (snd_vector_begin,snd_vector_end, *any);
if(any_in_snd_vector_iterator==snd_vector_end){
common2.push_back(*any);
}
}
return common2;
我在函数上面编写了一个函数来从向量部分获取与2个给定键相关的公共元素。当密钥等于s1和s2时,即s1 = 1且s2 = 4。然后我的功能应该给我0,2,5。但我得到了3,4。请帮我纠正我的功能。
答案 0 :(得分:4)
如果你可以保证你的载体被分类,那么你可以从O(mn)到O(m + n)大大提高你的表现:
std::vector<int> common;
std::set_intersection(vec1.begin(), vec1.end(),
vec2.begin(), vec2.end(),
std::back_inserter(common));
答案 1 :(得分:2)
你完全倒退了测试:
if(any_in_2nd_vector_iterator==2nd_vector_end){
当第二个向量中的元素未找到时,为true。试试!=
。
然后,您可以通过使用引用来避免不必要的向量复制:
const vector<int>& first_vector=my_map[s1];
如果你的向量变得更大,那么进行哈希查找可能会更快(如果向量总是保持排序,则预先排序的合并)而不是调用find
,这必须检查每个元素