【问题标题】:converting an array of null terminated const char* strings to a std::vector< std::string >将空终止的 const char* 字符串数组转换为 std::vector< std::string >
【发布时间】:2011-05-26 17:44:29
【问题描述】:

我有一个 Visual Studio 2008 C++ 函数,其中我得到了一个以 null 结尾的字符串数组 const char* 以及该数组中的字符串数。

我正在寻找将const char* 数组转换为std::vector&lt; std::string &gt; 的巧妙方法

/// @param count - number of strings in the array
/// @param array - array of null-terminated strings
/// @return - a vector of stl strings
std::vector< std::string > Convert( int count, const char* array[] );

Boost 很好,STL 很好。

【问题讨论】:

  • 这不是const char* 的数组。你的意思是字符串是按顺序存储并用NULL分隔的吗?
  • 在那里,我修复了它,因为 OP 没有响应,否则这个问题没有任何意义。
  • 当然有道理,只是和你建议的不一样
  • 是的,我就是这个意思。 @Noah - 感谢您修复它。
  • @Gene:OP 的代码与他的问题不符,因为他说“我正在寻找一种巧妙的方法将 const char*array 转换为std::vector&lt;std::string&gt;"(强调我的)。然后他使用单个const char* 作为函数参数。这个问题比代码更有意义——因此代码是由 Noah 编辑以反映这个问题的。就 OP 意味着代码而言,他有责任这样说 - 而不是你对可能是他的问题的所有善意的答案投反对票。

标签: c++ string stl vector


【解决方案1】:

假设你的函数的签名不小心出错了,你的意思是这样的吗?

#include <algorithm>
#include <iterator>
#include <string>
#include <vector>

std::vector<std::string> Convert(int count, const char **arr)
{
    std::vector<std::string> vec;
    vec.reserve(count);
    std::copy(arr, arr+count, std::back_inserter(vec));
    return vec;
}

int main()
{
    const char *arr[3] = {"Blah", "Wibble", "Shrug"};
    std::vector<std::string> vec = Convert(3, arr);
    return 0;
}

【讨论】:

  • 这就是我开始的原因,也是我决定提出这个问题的原因。我知道有一个更简单的方法......我的大脑只是没有把它浮出水面。
  • @PaulH:是的,很容易忘记vector 有一个专门为这种情况设计的构造函数——我想我已经在这种情况下证明了这一点:)
【解决方案2】:

像这样?:

vector< string > ret( array, array + count );

【讨论】:

  • 那些努力做到的人总是让我感到惊讶。 +1 保持简单。
  • 当然,这个答案的好处在于它并不聪明。
  • @Noah - 你是对的 - 我应该说“简单”而不是“聪明”。
  • 这个答案的另一个好处是它只有一行:)
  • meh... 一个衬垫不会给我留下深刻印象,除非它们确实是执行所需任务的最简单方法。
【解决方案3】:

我假设您的数组中的字符串由 0 分隔。

std::vector< std::string > Convert( int count, const char* array )
{
   std::vector< std::string > result;

   for(const char* begin = array; count; --count)
   {
    const char* end = begin;
    for(; *end; ++end);
    result.push_back(std::string(begin, end));
    begin = end + 1;
   }

   return result;
}

【讨论】:

  • 此代码适用于原始问题。也就是说,最初提问者的函数具有此签名,因此字符串由\0 分隔的假设是合理的。在这种情况下,此代码有效。但是,问题已被编辑。
  • 显然不是,因为它是我评论的旧版本。但无论如何。
【解决方案4】:

试试这个:

#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>


int main(int argc,char* argv[])
{
    // Put it into a vector
    std::vector<std::string>    data(argv, argv + argc);

    // Print the vector to std::cout
    std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多