Então, escrevi um monte de código que acessa elementos em um vetor stl pelo index [], mas agora eu preciso copiar apenas uma parte do vetor. Parece que vector.insert(pos, first, last)
é a função que eu quero ... exceto que eu tenho apenas o primeiro e o último como ints. Existe alguma maneira legal de obter um iterador para esses valores?
200
Respostas:
Tente o seguinte:
fonte
std::next(v.begin(), index)
maneira mencionada por @dirkgently
( v.begin() + index )
agradável e rápido para vetoresmas a maneira mais genérica e os iteradores de acesso aleatório também funcionam em tempo constante.
std::advance
( v.begin(), index )
EDIT
diferenças no uso:
ou
adicionado após as notas do @litb.
fonte
std::vector
, não faz sentido usá-lostd::advance
. Isso apenas o leva a pensar que está escrevendo código independente de contêiner (o que você não faz, pensando em regras de invalidação do iterador, diferentes complexidades de tempo de execução e outros enfeites). O único caso em questd::advance
faz sentido é quando você mesmo escreve um modelo que não sabe com que tipo de iterador está lidando.Além disso;
auto it = std::next(v.begin(), index);
Atualização: Precisa de um compilador compatível com C ++ 11x
fonte
Ou você pode usar
std::advance
fonte
Na verdade, std :: vector deve ser usado como guia C quando necessário. (O padrão C ++ solicita isso para implementação de vetores, tanto quanto eu sei - substituindo o array na Wikipedia ). Por exemplo, é perfeitamente legal fazer isso a seguir, de acordo com mim:
Obviamente, o foo não deve copiar o endereço passado como parâmetro e armazená-lo em algum lugar, ou você deve garantir em seu programa que nunca forneça nenhum item novo no vec ou solicite a alteração de sua capacidade. Ou falha na segmentação de risco ...
Portanto, no seu exemplo, isso leva a
fonte