|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
I want to replace one element in a list<string> by a list<string> and
I need to obtain an iterator to the first element in the inserted list. In code: void replace_element_by_list(list<string> &my_list, list<string>::iterator &iter_to_remove, const list<string> &list_to_insert) { list<string>::iterator next_iter = my_list.erase(iter_to_remove); my_list.insert(next_iter, list_to_insert.begin(), list_to_insert.end()); // Does 'iter_to_remove' point to the first element of the inserted list, or is it invalid? } When I try this code I find that 'iter_to_remove' indeed points to the first element of the inserted list. However, I'm wondering whether that is guaranteed. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
JurgenvonOerthel@hotmail.com wrote:
> I want to replace one element in a list<string> by a list<string> and > I need to obtain an iterator to the first element in the inserted > list. > In code: > > void replace_element_by_list(list<string> &my_list, > list<string>::iterator > &iter_to_remove, > const list<string> > &list_to_insert) { > list<string>::iterator next_iter = my_list.erase(iter_to_remove); Add list<string>::iterator prev_iter = next_iter; if (prev_iter == my_list.begin()) prev_iter = my_list.end(); else --prev_iter; > my_list.insert(next_iter, list_to_insert.begin(), > list_to_insert.end()); What does 'insert' return? > // Does 'iter_to_remove' point to the first element of the inserted > list, or is it invalid? 'iter_to_remove' is invalid. However, you can return 'prev_iter' here. The catch, of course, is that if you're removing the very first element in the list, you'll get 'end()'. > } > > When I try this code I find that 'iter_to_remove' indeed points to the > first element of the inserted list. However, I'm wondering whether > that is guaranteed. Nope. V -- Please remove capital 'A's when replying by e-mail I do not respond to top-posted replies, please don't ask |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On Dec 7, 8:17 pm, JurgenvonOert...@hotmail.com wrote:
> I want to replace one element in a list<string> by a list<string> and > I need to obtain an iterator to the first element in the inserted > list. > In code: > > void replace_element_by_list(list<string> &my_list, > list<string>::iterator > &iter_to_remove, > const list<string> > &list_to_insert) { > list<string>::iterator next_iter = my_list.erase(iter_to_remove); > my_list.insert(next_iter, list_to_insert.begin(), > list_to_insert.end()); > // Does 'iter_to_remove' point to the first element of the inserted > list, or is it invalid? > > } > > When I try this code I find that 'iter_to_remove' indeed points to the > first element of the inserted list. However, I'm wondering whether > that is guaranteed. This is not guaranteed. It is invalid. You could, however, get the iterator to the first element of the inserted range as below: void replace_element_by_list(list<string> &my_list, list<string>::iterator &iter_to_remove, const list<string> &list_to_insert) { list<string>::iterator next_iter = my_list.erase(iter_to_remove); list<string>::iterator prev_to_next_iter = --next_iter; my_list.insert(next_iter, list_to_insert.begin(), list_to_insert.end()); // Does 'iter_to_remove' point to the first element of the inserted list, or is it invalid? iter_to_remove = ++prev_to_next_iter; //iter_to_remove is guaranteed to point to the first element of the //inserted list/range } |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
On Dec 7, 4:30 pm, "Victor Bazarov" <v.Abaza...@comAcast.net> wrote:
> Add > list<string>::iterator prev_iter = next_iter; > if (prev_iter == my_list.begin()) > prev_iter = my_list.end(); > else > --prev_iter; I was afraid I would have to do something ugly like this. > What does 'insert' return? That's my point: it returns void. I think it should return an iterator to the first inserted element. That's what 'insert' of a single element does. |
|
![]() |
| Outils de la discussion | |
|
|