Форум программистов, компьютерный форум CyberForum.ru

Удалить эквивалентные пары из вектора пар при помощи стандартных алгоритмов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ copy constructor operator= http://www.cyberforum.ru/cpp-beginners/thread338734.html
сижу я значит почитываю черновик будущего стандарта и вижу const C& C::operator=( const C& other) { if ( this != &other ) { this->~C(); new (this) C(other); } return *this; }
C++ А сколько у вас ушло времени на изучение C++ ??? Я понимаю, это зависит от человека....но все же:) http://www.cyberforum.ru/cpp-beginners/thread338725.html
Проект на С++ C++
Добрый день. МБ вопрос глупый. Как мне из своего проекта на Visual Studio сделать нормальное человеческое приложение? Т.е. не папка Project, ехе-файл с дурацкой иконкой, всякие файлы .cpp и .h которых в норм. приложениях я никогда не наблюдал. Попробую яснее, как сделать чтобы мой проект стал, ну вроде как скачиваеш какое нибудь приложение с инета, запускаеш единственный ехе, идет...
Двусвязный список - Error C2011: ElementsList: переопределение типа "struct" C++
Что я сделал не правильно? typedef struct ElementsList { struct ElementsList *Prev; struct ElementsList *Next; TiXmlElement *Cur; } ElementsList; Выдает ошибку: 1>c:\users\powerglory\documents\visual studio 2010\projects\wininet\spaces\getting.h(4): error C2011: ElementsList: переопределение типа "struct"
C++ как сделать так, чтоб если вводишь не цифры, а буквы он не выкидывал из программы, а выполнял команду http://www.cyberforum.ru/cpp-beginners/thread338672.html
Всем привет. Помогите. я начал программировать в С++ и спрогал калькулятор. вот код: #include <iostream> #include <cmath> using namespace std; int main (void) { long double num1, num2, num3; char num, choice, num4;
C++ Компиляторы с поддержкой стандарта C++ 2009 Учусь по книге C++ для чайников 6-ое изд В книге есть елементы стандарта С++ 09 А какие IDE(с компилятором) с поддержкой этого стандарта есть ????? поиск юзал :cry:не нашёл подробнее

Показать сообщение отдельно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
15.08.2011, 18:12  [ТС]     Удалить эквивалентные пары из вектора пар при помощи стандартных алгоритмов
Цитата Сообщение от PointsEqual Посмотреть сообщение
а как этот вектор(пар) вывести на экран при помощи copy?
Цитата Сообщение от diagon Посмотреть сообщение
У меня при попытке скопировать его в ostream_iterator выдает километровую ошибку, хотя я даже переопределил << для пар =\
Знаю, что тема уже не актуальна, но я как раз сейчас сижу читаю книгу, и прочитал про эту проблему (в цитатах выше). Когда прочитал, то вспомнил, что недавно на форуме была затронута эта тема, а правильное решение так ни кто и не предложил, поэтому вот решил написать, думаю многим будет интересно)

В общем когда компилятор ищет нужную функцию, он пользуется т.н. ADL (Argument - Dependent Lookup - поиск с учетом аргуменов). Суть его заключается в следующем - функция ищется в том пространстве имен, к которому относятся ее аргументы. Если бы ADL не существовало, то вместо :
C++
1
2
std::string s;
std::cout<<s<<std::endl;
нам приходилось бы писать такие чудовищные конструкции:
C++
1
std::operator<<(std::operator(std::cout,s),std::endl);
но этого делать не приходиться, поскольку cout, string и endl находятся в пространстве имен std, то функция operator<< ищется там же.

Теперь по поводу нашей проблемы, думаю все (и я в т.ч.) пробовали сделать так:
C++
1
2
3
4
5
6
7
8
9
10
std::ostream& operator<<(std::ostream &os, const std::pair<int,int> &ob){
    return os<<ob.first<<" "<<ob.second;
}
 
int main() {
    std::vector<std::pair<int,int> >v;
    v.push_back(std::make_pair(10,20));
    v.push_back(std::make_pair(100,200));
    std::copy(v.begin(),v.end(),std::ostream_iterator<std::pair<int,int> >(std::cout,"\n"));
}
т.к. ostream_iterator<> и аргументы, переданные ему в качестве параметра шаблона и в качестве аргументов конструктора находятся в пространстве имен std, то и функция operator<< ищется там же и, естественно, не находится.
Поэтому правильно делать так:
C++
1
2
3
4
5
namespace std{
    std::ostream& operator<<(std::ostream &os, const std::pair<int,int> &ob){
        return os<<ob.first<<" "<<ob.second;
    }
}
теперь operator<< для std:: pair<int,int> будет найден, и алгоритм std::copy с итератором ostream_iterator<> скомпилируется и, естественно, отработает правильно.

Хотя добавление пользователем своих элементов в пространство имен std считается плохим тоном, но в данном случае это единственное (как пишет автор книги) разумное решение.



Вот про ADL (выдержка из книги)
 
Текущее время: 04:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru