C++向量减去元素
C++ vector subtract elements
我有一个这样的向量:
std::vector<float> v {5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
我想减去所有元素:
5120.2 - 5140.2 = -20.0
5120.2 - 5500.2 = -380.0
5120.2 - 5482.0 = -358.2
5120.2 - 5802.2 = -682.0
5140.2 - 5500.2 = -360.0
5140.2 - 5482.0 = -341.8
5140.2 - 5802.2 = -562.0
5500.2 - 5482.0 = 18.0
5500.2 - 5802.0 = -301.8
5482.0 - 5802.0 = -320.0
我只需要绝对值。
如何使用std::transform
解决此问题?或者任何其他方式,越简单越好。
如果你想使用std::transform
,你可以在一行中使用类似的lambda:
std::transform(v.begin(), v.end(), v.begin(),
[&](float a) { static float init{v[0]}; return init - a; });
实时示例
给出的结果是
0-20-380-361.8-682;
(和5120.2-5482.0 = -361.8
…(
编辑:在看到评论后,这个解决方案适用于第一个元素。因此,您可以通过更改v[1],v[2],...
来迭代该过程。
行为1(昆汀的答案(
std::vector<float> v{5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
std::vector<float> result;
size_t size = v.size();
for (size_t i = 0; i < size; i ++) { result.insert(result.end(), v.begin(), v.end()); }
for (size_t i = 0; i < size; i ++) {
std::transform(v.begin(), v.end(), result.begin() + i*size, [&](float a) { return v[i] - a; });
}
实时示例
给出的结果是:
0-20-380-361.8-682;20;0-360-341.8-662;380;360;0;2002年18月18日-302;361.8;341.8-2002年18月18日;0-320.2;682;662;302;320.2;0;
行为2(作为m.s.答案(
因此,我还试图重现另一种行为——注意棘手的索引部分,它不是那么优雅。。。
std::vector<float> v{5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
std::vector<float> result;
size_t size = v.size();
for (size_t i = 1; i < size; i ++) { result.insert(result.end(), v.begin() + i, v.end()); }
size_t sum = size*(size-1)/2;
for (size_t i = 0; i < size - 1; i ++) {
std::transform(v.begin() + i + 1, v.end(), result.begin() + sum - (size-i)*(size-i-1)/2, [&](float a) { return v[i] - a; });
}
实时示例给出的结果是:
-20-380-361.8-682-360-341.8-662;2002年18月18日-302-320.2;
您可以从这里使用combine_pairwise
:
#include <iostream>
#include <vector>
template<typename Iter, typename Func>
void combine_pairwise(Iter first, Iter last, Func func)
{
for(; first != last; ++first)
for(Iter next = std::next(first); next != last; ++next)
func(*first, *next);
}
int main() {
std::vector<float> v {5120.2, 5140.2, 5500.2, 5482.0, 5802.2};
std::vector<float> result;
auto op = [&](const float&f1, const float&f2){result.push_back(f1-f2);};
combine_pairwise(v.begin(), v.end(), op);
for (auto f : result)
{
std::cout << f << std::endl;
}
return 0;
}
视频直播
// New vector with enough space to hold the result
decltype(v1) v2;
v2.reserve(v.size() * v.size());
// Iterate over all possible pairs of (v × v)
auto ite = std::back_inserter(v2);
for(auto i1 : v)
for(auto i2 : v)
*ite++ = i1 - i2;
// Put the results back in v and let v2 die
swap(v, v2);
在Coliru 上直播
看起来你想要这样的东西。定义减法函数
float subtract(float first, float second)
{
return first - second;
}
然后你想在哪里进行转换:
std::transform (v.begin(), --v.end(), ++v.begin(), result_vector.begin(), subtract);
如果使用C++14,您可以只使用std::minus<float>而不是您自己的减法
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++:如何循环通过向量中的整数元素
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 不允许在向量中添加更多元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用并行参数向量调用元素向量的成员函数
- C++ 查找字符串中存在的元素向量
- 包含 std::threads 的元素向量
- 避免从单一元素向量转换为基元类型
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 如何为对元素(向量和int)配对创建unique_ptr也是unique_ptr
- 元素向量乘法 C++(代码不起作用)
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 遍历结构元素向量
- 犰狳C++中的元素向量或矩阵乘法
- 为什么'std::vector<int> b{2};'创建 1 元素向量,而不是 2 元素向量?
- 可移动元素向量的大小调整是否有效?
- 唯一元素向量的c++模板函数
- 获取索引和元素-向量问题
- 定义一个生成元素向量的函数时,正确的方法是什么?