Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2011, 08:03   #1
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию Алгоритмы STL и std::

День добрый! Чего-то я не пойму, почему при использовании алгоритма для контейнера из STL можно не указывать пространство имён std, а при работе например, с простым массивом, std:: обязательно? Допустим, на примере сортировки:
Код:
sort(vec.begin(), vec.end()); // работает и без std::
std::sort(arr, arr + size); // ели убрать std - то будет ошибка
Имя же оно и есть имя, как оно в одном случае может быть declarated, а в другом not declarated?
Спасибо.
rommster вне форума Ответить с цитированием
Старый 09.08.2011, 09:20   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Имя же оно и есть имя, как оно в одном случае может быть declarated, а в другом not declarated?
Есть такое понятие как перегрузка функций...
p51x вне форума Ответить с цитированием
Старый 09.08.2011, 09:36   #3
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

Могу предположить следующее - в первом случае параметры переданные функции sort - содержали итераторы вектора, который уже был объявлен выше как std::vector < type > vec
Почему я делаю такое предположение. Вот есть такой код:
Код:
#include <iostream>
#include <vector>
#include <algorithm>

#define DIMM 10 //размер контейнера

int main() {
	std::vector < int > ivec;

	for ( std::vector < int >::size_type i = 0; i != DIMM; ++i )
		ivec.push_back( i % 2 );

	sort( ivec.begin(), ivec.end() );

	for ( std::vector < int >::const_iterator it = ivec.begin(); it != ivec.end(); ++it  )
		std::cout << *it;
	std::cout << std::endl;


	return 0;
}
Компилятор g++.
1) Если закомментировать строку, где объявили вектор, то на строке с функцией sort компилятор выдаст ошибку: ‘sort’ was not declared in this scope
Как я понимаю - компилятор опирается на типы параметров, чтобы понять, что функция в пространстве std ( если раскомментировать строку с объявлением вектора ).
2) Если же после комментирования поправить вызов функции sort так std::sort( ‘ivec’ was not declared in this scope ); , то компилятор выдаст ошибку no matching function for call to ‘sort()’
А тут компилятор знает, что функция из пространства std, но не знает с какими параметрами ее вызывать.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 09.08.2011, 10:18   #4
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Roof Посмотреть сообщение
компилятор опирается на типы параметров, чтобы понять, что функция в пространстве std
Мне это кажется странным, но похоже так и есть:
Код:
namespace mySpace
{
	class myClass {/***/};
	void func(myClass & x) {/***/}
}

int main() 
{

	mySpace::myClass object;
	func(object); // ошибки нет:)

	return 0;
}
rommster вне форума Ответить с цитированием
Старый 09.08.2011, 10:24   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

только лучше не надейтесь всетаки на такое поведение компиля
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.08.2011, 16:18   #6
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 rommster Ничего странного нет в этом, это относится к теме перегрузки функций, как было сказано выше.
И лучше все прописывать четко в коде - какая функция чему принадлежит.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 09.08.2011, 17:21   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Поиск полных имен проводится в области видимости, вытекающей из уточняющей конструкции.

...

Поиск же неполных имен, напротив, выполняется в последовательно расширяющихся областях видимости, охватывающих данную... Такая разновидность поиска называется обычным поиском.

...

Современные методы поиска неполных имен в дополнения к обычному поиску могут включать так называемый поиск, зависящий от аргументов (argument-dependent lookup - ADL)
ADL: http://en.wikipedia.org/wiki/Argumen...nt_name_lookup
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
E2015 Ambiguity between 'std::log(double)' and 'std::log(long double)' Namolem Помощь студентам 3 02.04.2011 20:22
STL в QT конфликтует с STL в Borland nvrrus C++ Builder 0 31.03.2011 10:51
Задача из раздела Комбинаторные алгоритмы и алгоритмы на гра-фах в Паскале Klik_1602 Помощь студентам 1 04.01.2011 01:18
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
std Викдон Общие вопросы C/C++ 3 17.02.2009 11:33