La combinación de un vector de cadenas

He estado leyendo Acelerado C++ y tengo que decir que es un libro interesante.

En el capítulo 6, tengo que usar una función de <algoritmo> para concatenar a partir de un vector<cadena> en una sola cadena. Yo podría usar a acumular, pero no ayuda, porque la cadena de contenedores sólo puede push_back caracteres.

int main () {
  using namespace std;
  string str = "Hello, world!";
  vector<string>  vec (10, str);
  //Concatenate here?

  return 0;
}

¿Cómo puedo unirme a las cadenas juntos?

  • ¿Qué estás preguntando?
InformationsquelleAutor Bogdan | 2009-12-31

4 Kommentare

  1. 53

    Suponiendo que esto es cuestión de 6.8, no dicen que usted tiene que utilizar acumulan – se dice que el uso de «una biblioteca algoritmo». Sin embargo, puede utilizar acumulan:

    #include <numeric>
    
    int main () {
        std::string str = "Hello World!";
        std::vector<std::string> vec(10,str);
        std::string a = std::accumulate(vec.begin(), vec.end(), std::string(""));
        std::cout << a << std::endl;
    }

    Todos los que se acumulan hace es fijar ‘suma’ para el tercer parámetro y, a continuación, para todos los valores de ‘val’ desde el primer parámetro a parámetro de segundo, hacer:

    sum = sum + val

    a continuación, devuelve ‘suma’. A pesar del hecho de que se acumulan se declara en <numeric> funcionará para cualquier cosa que implementa operator+()

    • Gracias, he intentado utilizar acumulan con el 3er parámetro como un.empezar, no funciona, también he probado con back_inserter que fracasó también. Puede usted explicar cómo funciona esto? Gracias mucho.
    • Toma cada elemento en el vector de .begin() a .end() y se acumula en el tercer parámetro, que es un vacío std::string pasado como un temporal. std::acumulate()’s el valor de retorno es el resultado de la acumulación, se pasan por valor.
    • Por cierto, este enfoque posiblemente escalas muy mal ya que podría ser un lof de copiar / reallicating involucrados.
  2. 12

    ¿Std::copia?

    std::ostringstream os;
    std::copy( vec_strings.begin(), vec_string.end(), ostream_iterator<string>( os ) );
    cout << os.str() << endl;
  3. 9

    El siguiente fragmento de código se compila en Visual C++ 2012 y utiliza una función lambda:

    int main () {
        string str = "Hello World!";
        vector<string>  vec (10,str);
    
        stringstream ss;
        for_each(vec.begin(), vec.end(), [&ss] (const string& s) { cat(ss, s); });
    
        cout << ss.str() << endl;
    }

    La accumulate ejemplo en la 1ª respuesta es elegante, pero como sellibitze señaló, que reasigna con cada concatenación y escalas en O(N2). Este for_each fragmento de escalas en alrededor de O(N). Perfila ambas soluciones con 100K cadenas; el accumulate ejemplo tomó 23.6 segundos, pero este for_each fragmento tomó 0.054 sec.

    • Podría ser incluso más rápido para crear un std::sring llamada reserve(final-size), utilice sólo += que debe ser rápido ya que el buffer ya es de la talla correcta.
  4. 5

    No estoy seguro acerca de su pregunta.En dónde radica el problema? Su sólo una cuestión de un bucle.

    #include<vector>
    #include<string>
    #include<iostream>
    
    int main () 
    {
        std::string str = "Hello World!";
        std::vector<string>  vec (10,str);
    
        for(size_t i=0;i!=vec.size();++i)
            str=str+vec[i];
        std::cout<<str;
    }

    EDICIÓN :

    Uso for_each() de <algorithm>

    Intente esto:

    #include<vector>
    #include<string>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    string i;
    void func(string &k)
    {
      i+=k;
    }
    int main () {
        string str = "Hello World!";
        vector<string>  vec (10,str);
    
        for_each(vec.begin(),vec.end(),func);
        cout<<i;
        return 0;
      }
    • Tengo que usar una función de un algoritmo de cabecera para ello.
    • La pregunta en sí misma no es agradable. xD
    • O el uso de una adecuada functor Con for_each en lugar de una función libre. Le ahorra tener una variable global

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea