2017-10-05 70 views
0

我有一个整数向量,我想继续比较每一对,直到所有整数都进行比较。我想找到一对之间的绝对差异。例如:通过迭代遍历遍历一个向量内的两个整数的比较集合

30 
25 
65 
183 
83 
22 

比较30和25,然后比较65和183,然后比较83和22等等。我想找到每个比较的绝对差异。数字都是随机的,所以它必须找到对中的较大整数并从最小值中减去它。我会如何去做这件事?

回答

1

尝试使用迭代器在数组索引 - 大集,你会看到的差异。

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <numeric> 
#include <vector> 

int main() 
{ 
    std::vector <int> xs = { 30, 25, 65, 183, 83, 22, -3 }; 
    std::vector <int> ds; 

    auto print = [&]() 
    { 
    for (int d : ds) 
     std::cout << d << " "; 
    std::cout << "\n"; 
    }; 

    // method one (two-pass using standard algorithms) 
    { 
    std::adjacent_difference(begin(xs), end(xs), std::back_inserter(ds), 
     [](int a, int b) { return std::abs(b - a); } 
    ); 
    bool b = false; 
    ds.erase(std::remove_if(begin(ds), end(ds), [&b](auto foo) { return b = !b; }), end(ds)); 
    } 
    print(); 

    // method two (one-pass for random access iterators, two-pass for sequential iterators) 
    ds.clear(); 
    { 
    auto a = begin(xs); 
    auto b = next(a); 
    auto n = std::distance(begin(xs), end(xs))/2; 
    while (n--) 
    { 
     ds.emplace_back(std::abs(*b - *a)); 
     a = next(b); 
     b = next(a); 
    } 
    } 
    print(); 

    // method three (one-pass for sequential iterators) 
    ds.clear(); 
    { 
    auto a = begin(xs); 
    auto b = next(a); 
    while (a != end(xs) and b != end(xs)) 
    { 
     ds.emplace_back(std::abs(*b - *a)); 
     a = next(b); 
     b = next(a); 
    } 
    } 
    print(); 
} 

方法一只使用标准算法,效果很好,易于阅读。它总是进行两遍,并且比其他两种算法具有双倍的内存要求。

考虑到你有随机访问迭代器,方法2是最有效的。它只传递一次,只根据需要使用尽可能多的内存。您可以通过简单的ds.reserve(n)和简单分配来调整内存需求,假设ds也通过随机访问迭代器访问。

方法三是一种变体,它不会对您的输入迭代器进行任何处理,并仍然使用一次遍历。 (它可能仍然在流迭代器上失败,除非你记忆一些数据...大声笑,感谢C++。)

1
std::vector<int> numbers; 
// init... 

std::vector<int> diffs(numbers.size()/2); 

for (int i = 0, j = 0; i < numbers.size() - 1; ++j, i += 2) { 
    diffs[j] = abs(numbers[i] - numbers[i + 1]); 
} 
+0

完美只是添加std :: vector 数字{30,25,65,183,83,22}; std :: vector diffs(numbers.size()/ 2); –

+0

运行这个时,我得到“矢量下标超出范围”。以下是我使用的代码:https://pastebin.com/x628T5hz以及数字。我不知道为什么它给了我这个错误。 – Zezima

+0

也许它不在'if(file.is_open())'分支? – Grigory