【问题标题】:How to convert a vector<char*> to a vector<string>/string如何将向量<char*> 转换为向量<string>/string
【发布时间】:2011-08-01 15:32:22
【问题描述】:

我们有一个遗留方法,它返回一个vector 的字符指针,即vector&lt;char *&gt;。 现在,我只需要处理字符串 (std::string)。我该怎么做?

这个问题听起来很简单,但我遇到了几个网站,这些网站描述了这些考虑可能会导致内存泄漏。

现在,我要么想得到一个vector&lt;string&gt;,要么甚至是一个没有任何内存泄漏的字符串。我该怎么做?

【问题讨论】:

  • 使用向量并没有本质上的泄漏,只是它们在存活时相对更消耗内存。只需使用常规向量操作并在完成后将其销毁。 char* 可以使用字符串库轻松转换为适当的 c++ 字符串。

标签: c++ stl vector


【解决方案1】:

转换非常简单:

std::vector<char*> ugly_vector = get_ugly_vector();
std::vector<std::string> nice_vector(ugly_vector.begin(), ugly_vector.end());

不过,一旦你这样做了,你仍然需要确保ugly_vector 中的指针指向的对象被正确销毁。如何做到这一点取决于您使用的遗留代码。

【讨论】:

  • 向量构造函数是否调用了操作后面的字符串构造函数?
  • 你打败了我。这是我喜欢转换 argv[] 的技巧
  • std::vector&lt;std::string&gt; args(argv, argv + argc); // very handy
【解决方案2】:

使用std::copy:

using namespace std;
vector<char*> v_input;
...
// fill v_input
...
vector<string> v_output;

v_output.resize(v_input.size());
copy(v_input.begin(), v_input.end(), v_output.begin());

【讨论】:

    【解决方案3】:

    好吧,根据性能要求,您可以根据需要构造一个std::string。像这样:

    for(std::vector<char*>::const_iterator it = v.begin(); it != v.end(); ++it) {
        std::string s = *it;
    
        // do something with s
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多