使用迭代器在向量中插入下一个值以进行映射
Inserting next value in vector to map using iterator
我想将向量中的下一个和上一个元素添加到地图中。我以为我可以使用迭代器来做到这一点,但下面的代码对我不起作用。有人可以解释一下如何做到这一点以及我的错误是什么。谢谢你。
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 }
您不想在此循环中移动迭代器(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));
}
我想将向量中的下一个和上一个元素添加到地图中。我以为我可以使用迭代器来做到这一点,但下面的代码对我不起作用。有人可以解释一下如何做到这一点以及我的错误是什么。谢谢你。
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 }
您不想在此循环中移动迭代器(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));
}