這種拆分爲較小的階段:如何以優雅/快速的方式將STL字符串向量轉換爲char *?
- 我如何計算向量中的所有字符串的總長度?
- 分配的char * MEM空間
- 矢量字符串複製到該空間
是否有一個快速優雅的方式來做到這一點?
這種拆分爲較小的階段:如何以優雅/快速的方式將STL字符串向量轉換爲char *?
是否有一個快速優雅的方式來做到這一點?
最優雅的,但也許不是最快的,我能想到的辦法是以下幾點:
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;
我會做一些像ildjarn做的事情,但我不想爲此付出太多努力。 –
我該怎麼做,但增加了向量元素之間的空格?我想我們需要修改std :: accumulate中的運算符 – sramij
這不是一個高雅的要求,所以沒有優雅的解決方案,我能想到的。
未經測試的代碼
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();
}
將分配大小更改爲'total_size + 1'並添加'mem [total_size] ='\ 0';'。 –
我不確定OP是否需要以空字符結尾的字符串。例如,他可能通過TCP套接字發送數據。 – john
好點。但是如果他需要它是一個C風格的字符串,他顯然需要''\ 0''。 –
這裏是一個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函數庫,例如Boost。Phoenix)。
這裏是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
你說的是什麼意思那是'std :: vector'還是'std :: vector '? –
前者我假設矢量中有多個字符串。可能是矢量雖然似乎不太可能。 –
john
或輸出應該是char **。很難理解你的意思。 – amit