views:

669

answers:

3

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 <algorithm> to concatenate from a vector<string> into a single string. I could use accumulate, but it doesn't help because string containers can only push_back characters.

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

  return 0;
}

How do I join the strings together?

+6  A: 

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;
  }
Prasoon Saurav
I have to use a function from algorithm header to do this.
byte1918
It's not nice, but I guess it works, ty
byte1918
The question itself is not that nice. xD
Prasoon Saurav
Or use a proper functor With for_each instead of a free function. Saves you having a global variable
Glen
+18  A: 

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:

int main () {
    string str = "Hello World!";
    vector<string>  vec (10,str);
    string a = accumulate( vec.begin(), vec.end(), string("") );
    cout << a << 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 facr that accumulate is declared in <numeric> it will work for anything that implements operator+()

anon
Thanks, I tried using accumulate with the 3rd parameter as a.begin, didn't work, also I tried with back_inserter which failed too. Can you explain how this works? Thanks alot.
byte1918
It takes each element in the vector from .begin() to .end() and accumulates them in to the third parameter, which is an empty std::string passed in as a temporary. std::acumulate()'s return value is the result of the accumulation, passed by value.
John Dibling
Btw, this approach possibly scales very badly since there might be a lof of copying / reallicating involved.
sellibitze
+5  A: 

How about std::copy?

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