LINUX.ORG.RU

Вопрос по C++(яйцами не кидать)


0

0

В общем учу я C++ по Липпману, и выполняю задания после каждой главы, и что то застопорился я на одном, в книге описан такой вариант, а компилятор не пропускает, помогите пожалуйста кто может. Заранее спасибо.

#include <iostream>
#include <vector>
using namespace std;
bool is_equa1( const int*ia, int ia_size, const vector<int> &ivec );

int main() {
int zia [] = {1,2,3,4,5}, *ia=&zia[0], ia_size = 4, mb [] = {1,2,3,4,5};
vector<int> z(mb, mb+5);
vector<int> &zp = z;
if (is_equa1(ia,ia_size,zp)) { cout << "совпадают"; }
else {cout << "не совподают";};
return 0;
}

bool is_equa1( const int*ia, int ia_size, const vector<int> &ivec ) {

	for (vector<int>::iterator it=ivec.begin(); it != ivec.end(); it++ )  { //вот сдесь не нравится
		if (*it!=*ia) {return false;};
		ia++; 
		};
	return true; 
	};

Ответ на: комментарий от jtootf

да - если-что, то он за нас

// телепаты

anonymous
()
bool is_equa1( const int*ia, int ia_size, const vector<int> &ivec ) { 
 
   for (vector<int>::iterator it=ivec.begin(); it != ivec.end(); it++ )  { //вот сдесь не нравится 
      if (*it!=*ia) {return false;} 
      ia++;  
      } 
   return true;  
   } 
Dudraug ★★★★★
()
Ответ на: комментарий от anonymous

>>Куда не пропускает? Телепаты в отпуске.
сори, забыл, вот то что выдаёт:

main.cpp:17: error: conversion from ‘__gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >’ to non-scalar type ‘__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >’ requested

Ramzes001 ★★
() автор топика
Ответ на: комментарий от lazyklimm

>>патамушта не совподают
А что с чем не совпадает?

Ramzes001 ★★
() автор топика
Ответ на: комментарий от jtootf

>>и точка с запятой у тебя лишняя
Где?

Ramzes001 ★★
() автор топика

1>f:\nwprj\task1\task1\main.cpp(18) : error C2440: 'initializing' : cannot convert from 'std::_Vector_const_iterator<_Ty,_Alloc>' to 'std::_Vector_iterator<_Ty,_Alloc>'

Вообще думай.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Ладно

bool is_equa1( const int*ia, int ia_size, const vector<int> &ivec ) { 
 
	for (vector<int>::const_iterator it =   ivec.begin(); it < ivec.end(); it++ )  { //вот сдесь не нравится 
      if (*it!=*ia) {return false;}; 
      ia++;  
      }; 
   return true;  
   }
Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Первый вариант мне больше нравится.

bk_ ★★
()
Ответ на: комментарий от annulen

плохой стиль ставить ; после неклассовых скобок
Спасибо, буду знать.

Ramzes001 ★★
() автор топика
Ответ на: комментарий от Ramzes001

Наверное тем, что у тебя в параметрах передается const.

Советую почитать про const в Си++.

Чем funct(.......) отличается от funct(.......) const, да и вообще про const в Си++.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

>да и вообще про const в Си++.

еще почитать про mutable, и не читать раньше времени про const_cast :)

annulen ★★★★★
()
Ответ на: комментарий от annulen

плохой стиль ставить ; после неклассовых скобок

Никогда не ставил, но никогда и не задумывался над этим. Интересно почему это плохой стиль?

Мне вообще стиль ТС не нравится. Я бы написал что-то вроде:

#include <iostream> 
#include <vector> 

using namespace std; 

bool is_equa1( const int*ia, int ia_size, const vector<int> &ivec ); 
 
int main()
{ 
   int zia[] = {1,2,3,4,5};
   int* ia=&zia[0];
   int ia_size = 4;
   int mb[] = {1,2,3,4,5}; 
   vector<int> z(mb, mb+5); 
   vector<int> &zp = z; 
   if (is_equa1(ia,ia_size,zp)) 
   { 
      cout << "совпадают"; 
   } 
   else
   {
      cout << "не совподают";
   }; 
   return 0; 
} 
 
bool is_equa1( const int*ia, int ia_size, const vector<int> &ivec ) 
{ 
   for (vector<int>::const_iterator it=ivec.begin(); it != ivec.end(); it++ ) //вот сдесь не нравится 
   { 
      if (*it!=*ia)
         return false;
      ia++;  
   }
   return true;  
}

Хотя кто к чему привык, то ему и нравится.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Никогда не ставил, но никогда и не задумывался над этим. Интересно почему это плохой стиль?

Излишне, что излишне, то плохо. Очевидно же.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

>Излишне, что излишне, то плохо. Очевидно же.

Нет. Не очевидно. Если человек привык к этому, то это может облегчить восприятие.

Например все комментарии излишни, так как код скомпилируется и без них. Однако их наличие может облегчить восприятие кода.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Нет. Не очевидно. Если человек привык к этому, то это может облегчить восприятие.

Программист-одиночка - редкость, так что надо думать о других.

Dudraug ★★★★★
()
Ответ на: комментарий от pathfinder

Например все комментарии излишни, так как код скомпилируется и без них. Однако их наличие может облегчить восприятие кода.

Они даже для восприятия излишни, точки с запятой, а коменты нет.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

>Они даже для восприятия излишни, точки с запятой

Тебе и мне да, другим не обязательно.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

>Например все комментарии излишни, так как код скомпилируется и без них

они не излишни, так как несут смысл. пробелы улучшают читаемость

а от точки с запятой толку ноль, разве что скобку класса отличить можно

annulen ★★★★★
()
Ответ на: комментарий от pathfinder

>>Мне вообще стиль ТС не нравится.
У ТС нет стиля т.к. опыта то же почти нет.

Лирическое отступление:
В основном писал на PHP там да, разбивал на много строк(ибо часто переделывать приходилось) а здесь писал так как писалось.

Ramzes001 ★★
() автор топика
Ответ на: комментарий от pathfinder

>Никогда не ставил, но никогда и не задумывался над этим. Интересно почему это плохой стиль?

Потому что в данном случае точка с запятой --- это отдельная конструкция (пустой оператор) никак с блоком не связанная . Вот здесь будет синтаксическая ошибка (else не ассоциированный с if):

if(a)
{
  j++;
};
else 
  k++;
anonymous
()
Ответ на: комментарий от Ramzes001

А чем отличается const_iterator и iterator?

итератор - обобщение указателя; константный итератор - обобщение указателя на константные данные

jtootf ★★★★★
()
Ответ на: комментарий от annulen

>ну восемь строк на иф-елс это чересчур, здесь бы и трех (без скобок) хватило. а вот в две не люблю

Трех или четырех?

Ну вот видишь. А мне удобнее в восемь строк писать. Как правило подобные конструкции долго не задерживаются в исходном состоянии, и внутрь одного из двух блоков вставляется ещё одна, или две строки кода. И тогда приходится добавлять скобки если их не было. Предпочитаю конструкцию if-else сразу со скобками делать. Так сохраняется некоторое однообразие конструкций. Вместо двух типов if-else (со скобками и без) есть только один тип (со скобками). Мной полные конструкции if-else со скобками воспринимаются легче, чем без них.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Точка с запятой после класса — часть синтаксиса объявления класса. А после блочных скобок — это совершенно отдельная сущность «пустой оператор».

if(a)
{
  printf("hi\n");
}; /* тут ; это совершенно отдельный оператор */
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.