使用迭代器在向量中插入下一个值以映射

Posted

技术标签:

【中文标题】使用迭代器在向量中插入下一个值以映射【英文标题】:Inserting next value in vector to map using iterator 【发布时间】:2015-01-23 04:53:08 【问题描述】:

我想将向量中的下一个和上一个元素添加到地图中。我以为我可以使用迭代器来做到这一点,但下面的代码对我不起作用。有人可以解释一下如何做到这一点以及我的错误是什么。谢谢你。

 90  for ( it = vec.begin(); it != vec.end(); it++)
 91     
 92         int Flag1 = vec.front();
 93         int Flag2 = vec.back();
 94 
 95         if( *it == Flag1)
 96             mymap[*it].insert(*(it++)); // Add next element
 97         else if( *it == Flag2 )
 98             mymap[*it].insert(*(it--)); // Add previous element
 99         else
100         
101             mymap[*it].insert(*(it--)); // Add previous element
102             mymap[*it].insert(*(it++)); // Add next element
103         
104     

【问题讨论】:

【参考方案1】:

你不想在这个循环中移动你的迭代器(it++++it 都会这样做!),你只想得到下一个和上一个。在 C++11 中,我们在一个简单的函数调用中就有了这些:

std::next(it);
std::prev(it);

Pre-C++11,您可以轻松编写它们:

template <typename It> It next(It it)  std::advance(it, 1); return it; 
template <typename It> It prev(It it)  std::advance(it, -1); return it; 

所以添加下一个和上一个元素看起来像:

mymap[*it].insert(*next(it));
mymap[*it].insert(*prev(it));

请注意,您检查的不是迭代器是在开头还是结尾,而是在检查它们的值。如果您有重复的值,这可能会出现问题。更喜欢比较开头和结尾:

if (it == vec.begin()) 
   // only add next
   mymap[*it].insert(*next(it));

else if (next(it) == vec.end()) 
   // only add prev
   mymap[*it].insert(*prev(it));

else 
    // add both
   mymap[*it].insert(*next(it));
   mymap[*it].insert(*prev(it));

【讨论】:

不错!我不知道下一个和上一个可用。谢谢。

以上是关于使用迭代器在向量中插入下一个值以映射的主要内容,如果未能解决你的问题,请参考以下文章

c++迭代器在迭代向量时崩溃

向量迭代器在赋值重载中不兼容

C++中的向量迭代器

迭代器和向量的 Seg 错误

C++ 迭代器/向量在发布版本中不起作用

使用迭代器和向量的插入排序实现