在C ++中将一个向量转换为另一个向量,大小不同

时间:2015-11-10 16:14:27

标签: c++

有谁知道我是否可以使用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吗?

2 个答案:

答案 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]));});

实例: http://coliru.stacked-crooked.com/a/dfd2775e996d96c6

答案 1 :(得分:0)

首先,您无法在std::transform上使用不同类型的containers或类似的STL函数,例如vectorstring 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是最好的!!!