| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2011 13:25:43
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Oi pessoal,
Digamos que eu tenha uma lista com 10 posições. Quero inserir um valor na lista que fique na posição 4, por exemplo. Claro que quero que minha list se encarregue de qualquer realocação necessária.
Olhando o método insert (http://www.cplusplus.com/reference/stl/list/insert/) ele parece ser o que preciso. Mas a impressão que tenho é que teria que iterar sobre a lista até a posição 4, para então ter um iterator válido para aquela posição e então poder usar o insert. É isso mesmo? Não tem algum jeito de simplesmente passar a posição onde quero que o novo elemento fique sem ter de iterar sobre a lista antes?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2011 13:31:07
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Você quer usar um <list> (que é uma lista duplamente ligada) ou um <vector> ?
No caso de um <list>, para inserir na 4a. posição (supondo que você saiba que esse list tem 4 posições ou mais) você pode usar o algoritmo "advance" para obter um iterador que aponta para a 4a. posição.
http://www.cplusplus.com/reference/std/iterator/advance/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2011 13:33:46
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Estou optando por uma list ao invés de vector pois de vez em quando preciso dar um push_front nela. Se fosse um vector, teria um jeito mais simples de dar o insert?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2011 13:34:29
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Em particular, eu normalmente prefiro usar uma "deque" em vez de uma "list". Elas costumam gastar menos memória (porque são organizadas como listas de vetores, não como listas duplamente ligadas) e têm essa vantagem do acesso aleatório.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2011 13:37:04
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Eu estava usando uma deque também. Acabei trocando por list por conta desse trecho aqui que encontrei na página sobre o deque::insert no cplusplus.com: Insertions on other positions are usually less efficient than in list containers.
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2011 13:44:25
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
É porque se você estiver inserindo na primeira posição (por exemplo), você pode ter a seguinte situação:
a) O primeiro "chunk" do deque não está cheio - nesse ponto, o deque se comporta como um vector. Se a sua versão do compilador é antiga suficiente para não aceitar o "&&" ("move reference"), que é um tipo novo do C++0X, então ele irá chamar o copy constructor do tipo do vector (ou deque) vezes suficientes para poder mover os elementos de uma posição dentro do vector (ou deque).
b) O primeiro "chunk" está cheio - nesse caso, é necessário quebrar o chunk em dois - imagine o que tem de ser feito em termos de cópias então.
Eu normalmente não tenho deques tão grandes para eu ter de me preocupar com isso
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2011 13:52:42
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Mas então, seja qual for a estrutura, o jeito mais fácil pra dar o insert é usando o advance mesmo?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
|
|