我有一个向量容器,我想使用当前迭代器对前一个迭代器对其内容的值进行减法运算,任何帮助将不胜感激
问问题
2951 次
6 回答
6
vector<MyClass>::iterator itPrevious = my_vec.begin();
vector<MyClass>::iterator itCurrent = itPrevious;
if (itCurrent != my_vec.end())
{
for (++itCurrent; itCurrent != my_vec.end(); ++itCurrent)
{
// do something with itPrevious and itCurrent
itPrevious = itCurrent;
}
}
于 2013-06-25T21:55:54.343 回答
4
std::vector
的迭代器是 a RandomAccessIterator
,因此您可以对其执行整数运算。因此,您不需要单独的“当前”和“上一个”指针,只要您从以下位置开始迭代begin() + 1
:
vector<Foo> myVec = ...;
if(myVec.size() > 1) {
for(vector<Foo>::iterator iter = myVec.begin()+1; iter != myVec.end(); iter++) {
Foo current = *iter;
Foo previous = *(iter - 1);
Foo subtraction = current - previous;
...
}
}
当然,如果向量中的元素少于两个,则不能减去当前元素和前一个元素。如果您知道您的输入向量将始终包含至少两个元素,则大小检查可能是多余的,但为了安全起见,我将其包括在内。
于 2013-06-25T22:03:51.650 回答
2
if(v.size() < 2)
return;
auto curr = v.begin();
auto next = curr;
++next;
do
{
whatever(*next - *curr );
curr = next++;
} while( next != v.end() )
于 2013-06-25T21:56:22.963 回答
2
鉴于您要求一个向量,您可以使用迭代器算术:
#include <vector>
#include <iostream>
int main() {
std::vector<int> v{ 1, 2, 3, 4 };
for ( auto i = v.begin(); i != v.end(); ++i ) {
if ( i != v.begin() )
*i = *i - *(i-1);
}
for ( auto i : v )
std::cout << i << std::endl;
}
于 2013-06-25T22:01:24.247 回答
0
替代:
for (auto previous = v.begin(), current = previous + 1, end = v.end();
previous != end && current != end;
++previous, ++current)
{
std::cout << *current << " - " << *previous << " = " << *current - *previous << std::endl;
}
于 2013-06-25T23:03:27.287 回答
0
即有三种或多或少优雅的方式来解决您的问题。
定义一个新的函子
for_each
并在迭代中使用它
template<class T>
struct substractor {
substractor() : last(nullptr) {}
void operator()(T& item) const
{
if(last != nullptr)
*last -= item;
last = &item;
}
mutable T* last;
};
...
vector<int> v = {3, 2, 1};
for_each(v.begin(), v.end(), substractor<int>());
定义新算法
这里有某种对就地变换
template<typename It, typename Op>
void pair_transform(It begin, It end, Op op){
while(begin != end)
{
It next = std::next(begin);
if(next == end) break;
*begin = op(*begin, *next);
++begin;
}
}
...
vector<int> w = {3, 2, 1};
pair_transform(w.begin(), w.end(), std::minus<int>());
保持标准,使用变换
恕我直言,最好的一个 :) 简洁、标准,为了理解这段代码,别无他法。
vector<int> z = {3, 2, 1};
std::transform(z.begin(), z.end() - 1, z.begin() + 1, z.begin(),
std::minus<int>());
于 2013-06-26T12:13:52.240 回答