【问题标题】:convert <vector><string> TO <vector><int> C++, Win32将 <vector><string> 转换为 <vector><int> C++, Win32
【发布时间】:2013-03-15 05:20:57
【问题描述】:

有没有什么方法可以将向量转换为C++中的向量,win32?

我有这个带数字的字符串向量:

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

我需要把这个向量字符串转换成向量整数。

【问题讨论】:

  • 您的目标到底是什么?数字是什么格式的?性能与可读性有多重要?
  • 我只需要整数。之后我想乘以这个 int 向量中的一些数字

标签: c++ string vector


【解决方案1】:

给定:

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

您可以使用std::transform。使用std::back_inserter 将值插入std::vector&lt;int&gt;。对于一元函数,请使用 lambda 表达式,该表达式使用 std::stoi 将字符串转换为整数。

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

这是一个没有 lambdas 的版本(使用 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));

【讨论】:

  • 我会犹豫是否要疯狂使用 lambda。它们通常比使用 for 循环慢,并且从长远来看可能会导致可读性。更不用说并非所有编译器都完全支持它们。
  • @RichardJ.Ross 里面只有一个 lambda,我不知道这怎么算得上是“发疯了”。此外,我认为任何无法支持如此简单的 lambda 的编译器都不敢在其文档中提及关于 C++11 合规性的任何内容...
  • @us2012 我可以有一个只支持autodecltype 的编译器并说它具有“C++11 特性”,不是吗?另外,我确实赞成您的回答。
  • @RichardJ.Ross 这不是我的答案,我只是认为你对 lambdas 的建议缺乏一些事实证据:)。 (如果你的编译器不支持 lambdas(icc、msvc、gcc、clang 做,并且已经有一段时间了)你肯定会在编译时发现,我不太确定为什么这是不使用 lambdas 的原因.)
  • @RichardJ.RossIII 我给出了一个不再使用 lambdas 的版本。
【解决方案2】:

试试这个:

   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);
    }

【讨论】:

  • 我认为以前的解决方案很好,但这对我很有效,因为我的编译器没有“C++11 特性”。所以谢谢你!
  • 我不认为依赖硬编码的长度和使用遗留的 C 函数是一个好的解决方案。如果您没有 C++11,请使用 Richard J Ross 的答案并将 for (auto &amp;s : input) 更改为 for (vector&lt;string&gt;::iterator it = DataNumbers.begin(); it != DataNumbers.end(); it++) 以及将 std::stringstream parser(s); 更改为 std::stringstream parser(*it);
【解决方案3】:

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);
}

不知道当输入失败时你想做什么,这里没什么好说的了。

【讨论】:

  • 谢谢。但是 for 循环中的“s”是什么意思?
  • 字符串向量上的迭代器
  • @alon 不,这是字符串的副本
  • @richardjross 应该是'auto&',这里不需要复制。
  • 我建议 auto&amp;&amp; - 这将与 const 和 non-const 无缝配合。可以说,如果您不修改字符串或源向量,则应显式使用 const 引用。
【解决方案4】:

怎么样:

#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转换为vector,也可以将其他container转换为container2,例如: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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 2016-11-11
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多