将由null结尾的const char*字符串数组转换为std::vector< std::string >

12

我有一个Visual Studio 2008 C++函数,该函数接收一个由以空字符结尾的字符串const char*组成的数组以及该数组中字符串数的计数。

我正在寻找一种巧妙的方法,将const char*数组转换为std::vector< std::string >

/// @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也很好。


8
这不是一个“const char*”数组。你的意思是字符串按顺序存储,并由空值分隔吗? - Ben Voigt
2
我已经修复了它,因为原始问题的提问者没有回应,否则问题就没有任何意义。 - Edward Strange
1
是的,那就是我想说的。@Noah - 谢谢你修复它。 - PaulH
@Gene:OP的代码与他的问题不符,因为他说“我正在寻找一种聪明的方法将const char*数组转换为std::vector<std::string>”(重点在于“数组”)。然后他使用了一个单独的const char*作为函数参数。问题比代码更有意义--因此Noah编辑了代码以反映问题。如果OP的意思是代码,那么他有责任说出来--而不是让你对所有善意的答案进行投票否决,这可能是他的问题。 - Stuart Golodetz
@Gene:一个指向const char指针数组的第一个元素的指针类型是const char **,因为第一个元素是const char *。你当然可以在char数组中编码一系列以空字符结尾的字符串(然后根据这个假设解决问题,就像你所做的那样)--我并不是在争论这个--但这不是一个 const char * 数组,这似乎是OP的意思(这只是一个简单的拼写错误)。无论如何,让我们继续。 - Stuart Golodetz
显示剩余2条评论
4个回答

15

像这样吗?

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

1
总是让我惊讶的是那些试图用困难的方式去做事的人。保持简单加一分。 - Martin York
1
当然,这个答案的伟大之处在于它并不聪明。 - Edward Strange
@Noah - 你是对的 - 我应该说“简单”而不是“聪明”。 - PaulH
1
嗯... 除非一行代码确实是执行所需任务的最简单方法,否则我不会被深刻印象。 - Edward Strange
@Gene Bushuyev:@Noah Roberts:对我来说可行。请看下面。简单明了,无需编写代码。所有的优点都在其中。因为它们都能降低维护成本。 - Martin York
显示剩余2条评论

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

3
假设您的函数签名无意中出错了,您是指像这样吗?
#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
@PaulH:是的,很容易忘记vector有一个专门为这种情况设计的构造函数——我想我在这个案例中已经证明了这一点 :) - Stuart Golodetz

0

我假设在你的数组中,字符串是由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分隔是合理的。在这种情况下,这段代码可以工作。然而,问题已经被编辑过了。 - Chris Hopman
显然不是,因为我所评论的是旧版本。但不管怎样。 - Edward Strange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接