有谁知道我是否可以使用STL中的内容代替此代码:
std::vector<string> v = {"1", "2", "3", "4", "5", "6"};
std::vector<int> result;
for (auto i = 0; i < v.size(); i += 2)
{
int transformed = std::stoi(v[i]);
transformed += std::stoi(v[i+1]);
result.push_back(transformed);
}
result
最后是{3, 7, 11}
。
我可以通过某种方式调整std::transform
吗?
答案 0 :(得分:0)
以下方法使用boost :: iranges,它可以正常工作,但老实说,我觉得它很难看。
auto indices=boost::irange(0,int(v.size()/2));
std::for_each(indices.begin(),indices.end(),[&](unsigned index){result.push_back(stoi(v[2*index])+stoi(v[2*index+1]));});
答案 1 :(得分:0)
首先,您无法在std::transform
上使用不同类型的containers
或类似的STL函数,例如vector
和string
int
类型。您需要同时使用string或int来应用STL。假设你的两个矢量都是int
类型(请原谅我,但我只是展示你的操作如何发生): -
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v {1,2,3,4,5,6};
vector<int> result(v.size());
int i=0;
adjacent_difference (v.begin(), v.end(), result.begin(),[&i](int s1, int s2)
{
int sum=0;
if (i%2==0)
sum=s1+s2;
++i;
return sum;
});
auto it = partition (result.begin(), result.end(), [](int x)
{
return (x!=0);
});
int pos=it-result.begin()-1;
result.erase (it, result.end());
result.erase (result.begin());
result.resize(pos);
for_each (result.begin(), result.end(), [](int x)
{
cout<<x<<' ';
});
return 0;
}
输出将是: -
3 7 11
这里std::adjacent_difference
将根据我提供的函数计算相邻的总和。对于i = 0,2,4,2n,它将计算总和,否则它将返回0.但是第一个元素总是按原样复制,因此result
中的第一个元素将为1。
std::partition
用于将非零数字与0(只是一个逻辑,你可以使用你的)分开,因为i = 2n + 1,0被返回到result
。这会将iterator
返回到分区条件中的最后一个元素(此处为0开始后的最后一个非零数字e。)
现在我们已经分开了0&amp;非零数字,我们需要删除不需要的数字。因此,你得到2 erase
个函数:一个消除0&amp;另一个在开始时消除1。删除后,我们调整结果向量的大小&amp;迭代它。
但是,根据你的情况,for loop
是最好的!!!