Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I replace data of some range of std::vector

std::vector<char> v;
v.push_back('a');
v.push_back('b');
v.push_back('c');
v.push_back('d');
v.push_back('e');
v.push_back('f');

char c[3] = { 'z', 'x', 'y' };

// Want to make abzxyf
//v.insert(v.begin() + 2, c, c + 3); // it doesn't work as I wanted.

// Yes it works. but if c is more bigger, it will be crash.
std::copy(c, c + 3, v.begin() + 2);

v.clear();
v.push_back('a');
v.push_back('b');
v.push_back('c');
v.push_back('d');
v.push_back('e');
v.push_back('f');

// If vector needs more memory, I'd let him grow automactically
// So I tried this.(expected abcdezxy)
// But it's result is abcdezxyf. f is still remain.
std::copy(c, c + 3, std::inserter(v, v.begin() + 5));

What algorithm or method should I use?

like image 204
Benjamin Avatar asked Jul 19 '11 11:07

Benjamin


Video Answer


2 Answers

If the sizeof(c) is bigger, resize() before the copy() that should do the trick.

e.g.

if (sizeof(c) + 2 > v.size())
  v.resize(sizeof(c) + 2);
// now copy
std::copy(c, c + sizeof(c), v.begin() + 2);
like image 76
Nim Avatar answered Oct 02 '22 14:10

Nim


If you want to do text processing, you might consider using std::string which has replace functions.

std::vector does not. You have to use the appropriate combination of overwriting members combined with insert and erase.

like image 24
Bo Persson Avatar answered Oct 02 '22 14:10

Bo Persson