ベクトル コンテナが 1 つあり、現在のイテレータを前のイテレータに対して使用して、そのコンテンツの値に対して減算操作を行いたいと考えています。
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
の反復子は である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;
...
}
}
もちろん、ベクトル内の要素が 2 つ未満の場合、現在の要素と前の要素を減算することはできません。入力ベクトルが常に少なくとも 2 つの要素を持つことがわかっている場合、サイズ チェックは冗長になる可能性がありますが、安全のために含めました。
于 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
つまり、問題を解決するための多かれ少なかれエレガントな方法が 3 つあります。
新しいファンクターを定義する
そしてそれを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 に答える