13

ベクトルをC++、win32でベクトルに変換する方法はありますか?

私は数字でこの文字列ベクトルを持っています:

std::vector<std::string> DataNumbers;

このベクトル文字列をベクトル整数に変換する必要があります。

4

4 に答える 4

32

与えられた:

std::vector<std::string> DataNumbers;
// Fill DataNumbers
std::vector<int> Data;

を使用できますstd::transform。を使用しstd::back_inserterて、値をに挿入しますstd::vector<int>std::stoi単項関数には、文字列を整数に変換するために使用するラムダ式を使用します。

std::transform(DataNumbers.begin(), DataNumbers.end(), std::back_inserter(Data),
               [](const std::string& str) { return std::stoi(str); });

そして、これがラムダのないバージョンです(std::bind代わりに使用):

typedef int(*stoi_type)(const std::string&, std::size_t*, int);
std::transform(DataNumbers.begin(), DataNumbers.end(), std::back_inserter(Data),
               std::bind(static_cast<stoi_type>(&std::stoi),
                         std::placeholders::_1, nullptr, 10));
于 2013-03-25T16:26:23.653 に答える
4

それを行うC++の方法はこれです:

vector<std::string> input = ...;
vector<int> output;

for (auto &s : input) {
    std::stringstream parser(s);
    int x = 0;

    parser >> x;

    output.push_back(x);
}

入力が失敗したときに何をしたいのかわからなければ、ここで言うことはあまりありません。

于 2013-03-25T16:21:31.237 に答える
4

これを試して:

   std::vector<std::string> DataNumbers;
    // Fill DataNumbers
    std::vector<int> intNumbers;
    for (int i=0; i<= 5; i++)
    {
     int num = atoi(DataNumbers.at(i).c_str());
     intNumbers.push_back(num);
    }
于 2013-03-25T16:50:30.043 に答える
2

どうですか:

#include <algorithm>
#include <boost/lexical_cast.hpp>

template<typename C1, typename C2>
void castContainer(const C1& source, C2& destination)
{
    typedef typename C1::value_type source_type;
    typedef typename C2::value_type destination_type;
    destination.resize(source.size());
    std::transform(source.begin(), source.end(), destination.begin(), boost::lexical_cast<destination_type, source_type>);
}

vector<string>をvector<int>に変換したり、他のcontainer<T1>をcontainer2<T2>に変換したりできます(例:list-> list)。

完全なコード:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
#include <boost/lexical_cast.hpp>

template<typename C1, typename C2>
void castContainer(const C1& source, C2& destination)
{
    typedef typename C1::value_type source_type;
    typedef typename C2::value_type destination_type;
    destination.resize(source.size());
    std::transform(source.begin(), source.end(), destination.begin(), boost::lexical_cast<destination_type, source_type>);
}

template<typename T, typename T2>
std::vector<T>& operator<<(std::vector<T>& v, T2 t)
{
    v.push_back(T(t));
    return v;
}

main(int argc, char *argv[])
{   
    std::vector<std::string> v1;
    v1 << "11" << "22" << "33" << "44";
    std::cout << "vector<string>: ";
    std::copy(v1.begin(), v1.end(), std::ostream_iterator<std::string>(std::cout, ", "));
    std::cout << std::endl;

    std::vector<int> v2;
    castContainer(v1, v2);

    std::cout << "vector<int>: ";
    std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout, ", "));
    std::cout << std::endl;
}
于 2013-09-14T09:27:16.030 に答える