我有一个整数向量,我想继续比较每一对,直到所有整数都进行比较。我想找到一对之间的绝对差异。例如:通过迭代遍历遍历一个向量内的两个整数的比较集合
30
25
65
183
83
22
比较30和25,然后比较65和183,然后比较83和22等等。我想找到每个比较的绝对差异。数字都是随机的,所以它必须找到对中的较大整数并从最小值中减去它。我会如何去做这件事?
我有一个整数向量,我想继续比较每一对,直到所有整数都进行比较。我想找到一对之间的绝对差异。例如:通过迭代遍历遍历一个向量内的两个整数的比较集合
30
25
65
183
83
22
比较30和25,然后比较65和183,然后比较83和22等等。我想找到每个比较的绝对差异。数字都是随机的,所以它必须找到对中的较大整数并从最小值中减去它。我会如何去做这件事?
尝试使用迭代器在数组索引 - 大集,你会看到的差异。
#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++。)
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]);
}
完美只是添加std :: vector数字{30,25,65,183,83,22}; std :: vector diffs(numbers.size()/ 2); –
运行这个时,我得到“矢量下标超出范围”。以下是我使用的代码:https://pastebin.com/x628T5hz以及数字。我不知道为什么它给了我这个错误。 – Zezima
也许它不在'if(file.is_open())'分支? – Grigory