2013-12-21 7 views
1

Пытается сделать векторный код от part (5 элементов) из c-массива.Создание вектора из c-массива

const static int size = 10; 
cout << "vector from C-array: " << endl; 
int ia[size] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
vector<int> vi2(ia, ia + size-5); 

Но когда я пытаюсь перечислить векторные элементы, используя всю длину с-массив я получил все элементы, такие как вектор будет инициализирован как vector<int> vi2(ia, ia + size-5);. Никаких исключений или ошибок, которые выходят за допустимые пределы.

for(int i = 0; i < size; i++) { 
    cout << i << ":" << vi2[i] << " "; 
} 

В выходе:

0:1 1:2 2:3 3:4 4:5 5:6 6:7 7:8 8:9 9:10 

Почему вектор инициализации, используя второй из параметров, который описывает указатель на массив заканчивается, если он не использует его?

+0

проверили вы 'vi2.size()'? Он должен дать '5', и если это произойдет, доступ за пределы 5-го элемента даст вам неопределенное поведение. –

+0

'vi2' _is_, используя этот конец указателя массива. _You_ - тот, кто игнорирует его и индексирует его до «размера». – Shahbaz

+0

Если вы хотите, чтобы исключение было выбрано, используйте 'vector :: at()' вместо 'vector :: operator []'. \ –

ответ

1

C++ не создает исключения, как это делает Java, если вы обращаетесь к индексу вне пределов. Это undefined behavior, и вы просто не должны этого делать.

for(int i = 0; i < vi2.size(); i++) { 
    cout << i << ":" << vi2[i] << " "; 
} 

См A Guide to Undefined Behavior in C and C++:

В языке программирования безопасно, ошибки в ловушке, как они происходят. Java, например, в значительной степени безопасен через свою систему исключений. В языке программирования небезопасных ошибки не попадают в ловушку. Скорее, после выполнения ошибочной операции программа продолжает двигаться, но с незаметным образом, что может иметь наблюдаемые последствия позже.

+0

Согласитесь об исключении, но инициализация вектора выглядит для меня глупо. Почему C++ нуждается в копировании всего массива в вектор, вместо того, чтобы копировать только 5 элементов. – vico

+0

Это не так. Я сомневаюсь, что большинство компиляторов делают это, так как это настолько неэффективно. – leewz

+0

@ user1501700 он копирует только 5 элементов. – juanchopanza

3

Вы получаете доступ к своему вектору за пределами границ. Это undefined поведение. Нет требования, чтобы было исключено исключение.

Вы не должны превышать vi2.size()-1.

for(int i = 0; i < vi2.size(); ++i) 
{ 
    std::cout << i << ":" << vi2[i] << " "; 
} 
1

Если вы действительно хотите исключение быть выброшен, когда вы вышли за пределы, используйте .at():

for(int i = 0; i < size; i++) { 
    cout << i << ":" << vi2.at(i) << " "; 
} 

Это, как говорится, лучше использовать фактический размер vi2 (vi2.size()) вместо этого.

2

Оператор [] не выполняет никаких ограничений (аналогично оператору [] в C и C++, который работает с необработанными массивами).

Если вы хотите исключение быть выброшен, а затем использовать функцию at члена:

std::vector<int> v { 1, 2, 3, 4, 5 }; 
int invalidInt = v.at(5); // hell breaks lose, says the runtime 
Смежные вопросы