Combining a vector of strings

后端 未结 4 2008
忘掉有多难
忘掉有多难 2020-12-24 14:11

I\'ve been reading Accelerated C++ and I have to say it\'s an interesting book.

In chapter 6, I have to use a function from to concatenate from a v

相关标签:
4条回答
  • 2020-12-24 14:39

    How about std::copy?

    std::ostringstream os;
    std::copy( vec_strings.begin(), vec_string.end(), ostream_iterator<string>( os ) );
    cout << os.str() << endl;
    
    0 讨论(0)
  • 2020-12-24 14:40

    The following snippet compiles in Visual C++ 2012 and uses a lambda function:

    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;
    }
    

    The accumulate example in the 1st answer is elegant, but as sellibitze pointed out, it reallocates with each concatenation and scales at O(N²). This for_each snippet scales at about O(N). I profiled both solutions with 100K strings; the accumulate example took 23.6 secs, but this for_each snippet took 0.054 sec.

    0 讨论(0)
  • 2020-12-24 14:46

    Assuming this is question 6.8, it doesn't say you have to use accumulate - it says use "a library algorithm". However, you can use accumulate:

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

    All that accumulate does is set 'sum' to the third parameter, and then for all of the values 'val' from first parameter to second parameter, do:

    sum = sum + val
    

    it then returns 'sum'. Despite the fact that accumulate is declared in <numeric> it will work for anything that implements operator+()

    0 讨论(0)
  • 2020-12-24 14:51

    I am not sure about your question.Where lies the problem? Its just a matter of a loop.

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

    EDIT :

    Use for_each() from <algorithm>

    Try this:

    #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;
      }
    
    0 讨论(0)
提交回复
热议问题