2010-12-16 23 views
11

Visual Studio 2008 C++ işlevim var, burada bir dizi null sonlandırılmış dizeler const char* verilmiş ve bir sayı Bu dizideki dizelerin sayısı.null sonlandırılmış const char * dizelerinin bir dizisini bir std :: vektörüne çevirme <std :: string>

Ben 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 için const char* bir dizi dönüm akıllı yol arıyorum iyi, STL gayet iyi.

sayesinde PaulH

+8

. Dizelerin sıralı olarak depolandığı ve NULL tarafından ayrıldığı anlamına mı geliyor? –

+2

OP yanıt vermediğinden ve sorunun başka bir anlam ifade etmediğinden beri bunu tamir ettim. –

+0

Tabii ki, mantıklı, sadece –

cevap

14

şey mi dizi dizeleri ben varsayalım

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

@genpfault: Evet, bu daha kolay olurdu :) inekler * kendiliğinden ... –

+1

Her zaman bana bunu yapan ve bunu zor yoldan yapan insanı hayrete düşürür. Basit tutmak için +1. –

+0

dışında çalışmıyor –

2

senin fonksiyonunun imza istemeden yanlış olduğunu varsayarsak, böyle bir şey demek? Böyle

#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; 
} 
+0

Bu, başladığım ve neden soruyu sormaya karar verdiğim. Daha kolay bir yol olduğunu biliyordum ... Beynim sadece yüzeye getirmiyordu. – PaulH

+0

@PaulH: Yup, 'vector' tam olarak bu durum için tasarlanmış bir kurucu var unutmak çok kolay - bu durumda ispat ettiğimi düşünüyorum :) –

0

0s ile ayrılır ?:.

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

Çalışmama hakkında konuşun ... –

+0

Lütfen konuşun, aksi halde ... –

+0

Bu kod, orijinal soru için çalışır. Yani, asıl olarak, sorgunun işlevi bu imzayı taşıyordu ve dolayısıyla dizelerin '\ 0' ile ayrıldığı varsayımı makul. Bu durumda, bu kod çalışır. Ancak, soru düzenlendi. –

4

bu deneyin:

`const char *` bir dizi değil
#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")); 
} 
İlgili konular