Я нашел кое-что удивительное в std::vector
, о котором я думал, что хотел бы спросить здесь, чтобы, надеюсь, получить интересные ответы.
Приведенный ниже код просто копирует строку в символьный вектор и печатает содержимое вектора двумя способами.
#include <vector>
#include <string>
#include <iostream>
int main()
{
std::string s("some string");
std::vector<char> v;
v.reserve(s.size()+1);
// copy using index operator
for (std::size_t i=0; i<=s.size(); ++i)
v[i] = s[i];
std::cout << "&v[0]: " << &v[0] << "\n";
std::cout << "begin/end: " << std::string(v.begin(), v.end()) << "\n";
// copy using push_back
for (std::size_t i=0; i<=s.size(); ++i)
v.push_back(s[i]);
std::cout << "&v[0]: " << &v[0] << "\n";
std::cout << "begin/end: " << std::string(v.begin(), v.end()) << "\n";
return 0;
}
Сборка и запуск это дает:
$ g++ main.cpp -o v && ./v
&v[0]: some string
begin/end:
&v[0]: some string
begin/end: some string
Я ожидал, что в обоих случаях она будет правильно печатать строку , но при назначении символа за символом с помощью оператора индекса ничего не печатается при использовании begin()
и end()
итераторы .
Почему end()
не обновляется при использовании []
? Если это умышленно, то по какой причине оно работает так?
Есть ли разумное объяснение этому поведению? :)
Пока я пробовал это только с gcc 4.6.1.