C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: stdext::is_sorted


(過去ログ 57 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■32335 / inTopicNo.1)  stdext::is_sorted
  
□投稿者/ K (7回)-(2009/02/05(Thu) 10:38:14)

分類:[C/C++] 

http://blogs.wankuma.com/melt/archive/2008/05/29/140039.aspx

ここを見たのをきっかけに、VC++にはstdext名前空間があることを知りました。
stdext名前空間には、hash_setやhash_mapなどがあることを知りました。
他にもいろいろあったので、使ってみました。
例えば、is_sorted があったので使ってみましたがコンパイルが通りません。
(is_sortedしか試してませんが、、、)
どうしてでしょうか?
因みに、VCの拡張機能は有効にしてあります。

#include <vector>
#include <hash_set> // hash_set
#include <hash_map> // hash_map
#include <algorithm> // is_sorted

int main()
{
	stdext::hash_set<int> s; // OK
	stdext::hash_map<int, int> m; // OK

	std::vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);

	stdext::is_sorted(v.begin(), v.end()); // コンパイルエラー
}

エラー内容
error C2039: 'is_sorted' : 'stdext' のメンバではありません。
error C3861: 'is_sorted': 識別子が見つかりませんでした

引用返信 編集キー/
■32339 / inTopicNo.2)  Re[1]: stdext::is_sorted
□投稿者/ アキラ (159回)-(2009/02/05(Thu) 11:32:41)
アキラ さんの Web サイト
No32335 (K さん) に返信

<algorithm>にあるis_sortedの定義は以下のようになってます。

#if _HAS_TRADITIONAL_STL

...

template<class _FwdIt> inline
    bool is_sorted(_FwdIt _First, _FwdIt _Last)

template<class _FwdIt, class _Pr> inline
    bool is_sorted(_FwdIt _First, _FwdIt _Last, _Pr _Pred)


#endif /* _HAS_TRADITIONAL_STL */



「_HAS_TRADITIONAL_STL」マクロの値に1を設定すればいいみたいです。
デフォルトで0になってるからそのうちなくなるんじゃないかと。

#include <yvals.h>

#ifdef _HAS_TRADITIONAL_STL
  #undef _HAS_TRADITIONAL_STL
  #define _HAS_TRADITIONAL_STL 1
#endif

using namespace std;
#include <algorithm>

int main()
{
  int ar[] = {1, 2, 3};
  stdext::is_sorted(ar, ar + 3); // OK
}


引用返信 編集キー/
■32342 / inTopicNo.3)  Re[1]: stdext::is_sorted
□投稿者/ επιστημη (1656回)-(2009/02/05(Thu) 11:42:25)
επιστημη さんの Web サイト
2009/02/05(Thu) 12:00:19 編集(投稿者)
> 例えば、is_sorted があったので使ってみましたがコンパイルが通りません。
> (is_sortedしか試してませんが、、、)
> どうしてでしょうか?

#if _HAS_TRADITUINAL_STL
  ...
#endif

で囲った中にあり、さらに
#define _HAS_TRADITIONAL_STL 0
で潰されているからです。

また、is_sortedは(本来)名前空間 std 内です。

...って、出遅れてんよ orz

引用返信 編集キー/
■32344 / inTopicNo.4)  Re[2]: stdext::is_sorted
□投稿者/ アキラ (160回)-(2009/02/05(Thu) 11:49:50)
アキラ さんの Web サイト
あ、is_sortedは次期標準ライブラリに入る予定なので
VC++10(2010)ではstdextじゃなくて正式にstd名前空間に入るかもしれませんね。

http://d.hatena.ne.jp/faith_and_brave/20080730/1217408614

引用返信 編集キー/
■32348 / inTopicNo.5)  Re[2]: stdext::is_sorted
□投稿者/ K (9回)-(2009/02/05(Thu) 12:22:21)
No32339 (アキラ さん) に返信

> #include <yvals.h>
> 
> #ifdef _HAS_TRADITIONAL_STL
>   #undef _HAS_TRADITIONAL_STL
>   #define _HAS_TRADITIONAL_STL 1
> #endif
> 
> using namespace std;

#include <algorithm> の前に↑を書けばコンパイルが通る様になりました。

using namespace std; を書かないと、
error C3861: '_Debug_lt': 識別子が見つかりませんでした
と怒られますね・・・なんでだろう?


引用返信 編集キー/
■32349 / inTopicNo.6)  Re[3]: stdext::is_sorted
□投稿者/ 774RR (310回)-(2009/02/05(Thu) 12:28:39)
ついでに cygwin/gcc の場合 <ext/algorithm> に入っていたりします > is_sorted
namespace __gnu_cxx に入っているので namespace alias しないと移植性がない・・・
引用返信 編集キー/
■32351 / inTopicNo.7)  Re[3]: stdext::is_sorted
□投稿者/ επιστημη (1657回)-(2009/02/05(Thu) 12:39:03)
επιστημη さんの Web サイト
ついでついでに、hash_XXX は unordered_XXX に改名されます。

引用返信 編集キー/
■32356 / inTopicNo.8)  Re[3]: stdext::is_sorted
□投稿者/ アキラ (161回)-(2009/02/05(Thu) 13:16:20)
アキラ さんの Web サイト
No32348 (K さん) に返信
> using namespace std; を書かないと、
> error C3861: '_Debug_lt': 識別子が見つかりませんでした
> と怒られますね・・・なんでだろう?

バグですね。

is_sorted関数を書き換えて_DEBUG_RANGEと_DEBUG_LTの頭にstd::を付けると通るようになります。

template<class _FwdIt> inline
    bool is_sorted(_FwdIt _First, _FwdIt _Last)
    {   // test is range is ordered by operator<

        std::_DEBUG_RANGE(_First, _Last); // ここと
	for (_FwdIt _Next = _First; _First != _Last && ++_Next != _Last; ++_First)
            if (std::_DEBUG_LT(*_Next, *_First)) // ここ
                return (false);
            return (true);
        }
    }


引用返信 編集キー/
■32358 / inTopicNo.9)  Re[4]: stdext::is_sorted
□投稿者/ επιστημη (1658回)-(2009/02/05(Thu) 13:21:50)
επιστημη さんの Web サイト
> バグですね。

_で始まるベンダ定義のマクロで潰して寝かしつけてんのをわざわざ起こしたアンタが悪い! てかー

引用返信 編集キー/
■32361 / inTopicNo.10)  Re[5]: stdext::is_sorted
□投稿者/ アキラ (162回)-(2009/02/05(Thu) 13:30:52)
アキラ さんの Web サイト
訂正です。

> is_sorted関数を書き換えて_DEBUG_RANGEと_DEBUG_LTの頭にstd::を付けると通るようになります。

これだとReleaseビルドしたときにエラーになっちゃいますね。
is_sorted関数の先頭で

using namespace std;

してください。
引用返信 編集キー/
■32370 / inTopicNo.11)  Re[4]: stdext::is_sorted
□投稿者/ K (11回)-(2009/02/05(Thu) 16:02:38)
No32356 (アキラ さん) に返信
> ■No32348 (K さん) に返信
>>using namespace std; を書かないと、
>>error C3861: '_Debug_lt': 識別子が見つかりませんでした
>>と怒られますね・・・なんでだろう?
>
> バグですね。

そうですか、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -