2011-08-10 45 views
1

這種拆分爲較小的階段:如何以優雅/快速的方式將STL字符串向量轉換爲char *?

  1. 我如何計算向量中的所有字符串的總長度?
  2. 分配的char * MEM空間
  3. 矢量字符串複製到該空間

是否有一個快速優雅的方式來做到這一點?

+0

你說的是什麼意思那是'std :: vector '還是'std :: vector '? –

+0

前者我假設矢量中有多個字符串。可能是矢量雖然似乎不太可能。 – john

+0

或輸出應該是char **。很難理解你的意思。 – amit

回答

7

最優雅的,但也許不是最快的,我能想到的辦法是以下幾點:

std::string s = std::accumulate(v.begin(), v.end(), std::string()); 
char * c = new char[s.size() + 1]; 
std::strcpy(c,s.c_str()); 

雖然我已經不是我自己的裸體動態分配的粉絲,並親自絕不會使用它,我會留給你理清。

如果您需要添加的元素之間的空間分隔符,它變得更加複雜一點,我可能會使用不同的解決方案,例如:

std::ostringstream oss; 
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(oss," ")); 
size_t sz = oss.str().size(); 
if(sz) --sz; // truncate trailing space if there is one 
char * c = new char[sz+1]; 
std::copy_n(oss.str().c_str(), sz, c); 
c[sz] = 0; 
+0

我會做一些像ildjarn做的事情,但我不想爲此付出太多努力。 –

+0

我該怎麼做,但增加了向量元素之間的空格?我想我們需要修改std :: accumulate中的運算符 – sramij

1

這不是一個高雅的要求,所以沒有優雅的解決方案,我能想到的。

未經測試的代碼

vector<string> vec = ...; 
size_t total_size = 0; 
for (size_t i = 0; i < vec.size(); ++i) 
    total_size += vec[i].size(); 
char* mem = new char[total_size]; 
char* p = mem; 
for (size_t i = 0; i < vec.size(); ++i) 
{ 
    memcpy(p, vec[i].data(), vec[i].size()); 
    p += vec[i].size(); 
} 
+0

將分配大小更改爲'total_size + 1'並添加'mem [total_size] ='\ 0';'。 –

+1

我不確定OP是否需要以空字符結尾的字符串。例如,他可能通過TCP套接字發送數據。 – john

+0

好點。但是如果他需要它是一個C風格的字符串,他顯然需要''\ 0''。 –

4

這裏是一個C++ 0x中實現:

#include <cstddef> 
#include <algorithm> 
#include <numeric> 
#include <string> 
#include <vector> 

std::vector<char> concat_strings(std::vector<std::string> const& vecs) 
{ 
    std::size_t const cumulative_length = std::accumulate(
     vecs.begin(), 
     vecs.end(), 
     static_cast<std::size_t>(0), 
     [](std::size_t const acc, std::string const& str) 
     { 
      return acc + str.size(); 
     } 
    ); 

    std::vector<char> ret; 
    ret.reserve(cumulative_length); 

    std::for_each(
     vecs.begin(), 
     vecs.end(), 
     [&ret](std::string const& str) 
     { 
      ret.insert(ret.end(), str.begin(), str.end()); 
     } 
    ); 

    return ret; 
} 

產生的std::vector<char>是你的有效char*。對於C++ 03,它將大致相同,但是您需要適當的函數來代替lambda表達式(或者使用C++ 03 lambda函數庫,例如BoostPhoenix)。

0

這裏是STL方式:

#include <algorithm> // std::copy 
#include <iostream> // std::cout 
#include <iterator> // std::ostream_iterator 
#include <sstream> // std::ostring_stream 
#include <string>  // std::string 
#include <vector>  // std::Vector 

using namespace std; 

typedef std::vector<std::string> string_vector; 

int main(int argc, char ** argv) 
{ 
    string_vector v; 
    v.push_back("string 1, "); 
    v.push_back("string 2, "); 
    v.push_back("string 3"); 

    std::ostringstream os; 
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(os, "")); 
    std::string result = os.str(); 

    std::cout << "result: " << result << std::endl; 

    return 0; 
} 

輸出: 「串矢量」

result: string 1, string 2, string 3 
相關問題