2016-09-22 15 views
0

の初期化に失敗し、任意の入力に感謝します。私は操作しようとしている大きなデータセットを持っています。私はアクティブな要素をリストに保持していて、リストがアクティブでなくなったら削除します。私はいくつかのデータ構造ですべての要素をアクティブおよび非アクティブに保ちたい。現在、マップやunordered_mapを試していますが、提案をお待ちしています。順序付けされていないマップ

マップをしようとしたとき、私は

clang++ -std=c++11 -Wall -Wextra

でコンパイルしています:

#include <map> 
std::map <class1, std::string> fullMap; 
//and later... 
for (std::list<class1>::iterator x = l.begin(); x != l.end(); x++) 
{ 
    fullMap[(*x)] = s 
} 

出力が読み:

error: invalid operands to binary expression ('const class1' and 'const class1') { return __x < __y; }

私はClass1のためにオペレータ未満をオーバーロードしているにもかかわらず。 このエラーはマップのオーバーロードされたブラケット演算子で発生します。 私はunordered_mapに格納しようとしました。

#include <unordered_map> 
std::unordered_map <class1, std::string> fullMap; 

、プログラムはさらに混乱してfullMapの初期化で失敗:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/include/g++-v4/bits/hashtable_policy.h:830:23: error: implicit instantiation of undefined template 'std::hash' bool __use_ebo = !__is_final(_Tp) && __is_empty(_Tp)> ^

/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/include/g++-v4/bits/hashtable_policy.h:1073:15: note: in instantiation of default argument for '_Hashtable_ebo_helper<1, std::hash >' required here private _Hashtable_ebo_helper<1, _H1>, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/include/g++-v4/bits/hashtable_policy.h:1403:12: note: in instantiation of template class 'std::__detail::_Hash_code_base >, std::__detail::_Select1st, std::hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>' requested here : public _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2, _Hash, ^

/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/include/g++-v4/bits/hashtable.h:175:14: note: in instantiation of template class 'std::__detail::_Hashtable_base >, std::__detail::_Select1st, std::equal_to, std::hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits >' requested here : public __detail::_Hashtable_base<_Key, _Value, _ExtractKey, _Equal, ^

/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/include/g++-v4/bits/unordered_map.h:100:18: note: in instantiation of template class 'std::_Hashtable >, std::allocator > >, std::__detail::_Select1st, std::equal_to, std::hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits >' requested here _Hashtable _M_h; ^

main.cpp:34:44: note: in instantiation of template class 'std::unordered_map, std::hash, std::equal_to, std::allocator > > >' requested here std::unordered_map fullMap; ^

/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/include/g++-v4/bits/functional_hash.h:58:12: note: template is declared here struct hash;

は、私はダウンだけで、関連するチャンクにコードをカットしようとしましたが、より多くの情報があるなら、私に知らせて必要です。読んでくれてありがとう、どんな助けもありがとう。

// 
// class1.hpp 
// class 
// 
// Created by Roach on 9/3/16. 
// Copyright © 2016 Roach. All rights reserved. 
// 

#ifndef class1_hpp 
#define class1_hpp 

#include <iostream> 
#include <sstream> 
#include <iomanip> 
#include <ctime> 


class class1 
{ 
public: 
    class1(); 
    class1 (const class1& t); // copy constructor 
    ~class1(); // destructor 
    class1& operator = (const class1& t); // assignment operator 
    bool operator == (const class1& t); // comparison operator 
    void setSetting2 (std::string t); 
    void setSetting1 (std::string p); 
    void setSetting3 (double d); 
    void setSetting4 (double d); 
    std::tm getTime() const; 
    std::string getSetting2() const; 
    double getSetting3() const; 
    double getSetting4() const; 
    std::string getSetting1() const; 
    void setSetting3End (double d); 
    void setSetting4End (double d); 
    double getSetting3End() const; 
    double getSetting4End() const; 
    double getSetting3flag() const; 
    double getSetting4flag() const; 
    double getSetting3final() const; // in pips 
    double getSetting4final() const; // in pips 
    void processList (class1::class1 t); 
    void setNew(); 
    //void dump (std::ostream& os) const; 

private: 
    std::string setting1; 
    double setting4; 
    double setting3; 
    std::tm setting2; 
    double setting4End_; 
    double setting3End_; 
    bool setting4Flag_; 
    bool setting3Flag_; 
    double setting4final_; // in pips 
    double setting3final_; // in pips 
}; 
// stream extraction operator 
std::ostream& operator << (std::ostream& os, const class1& s); 
std::istream& operator >> (std::istream& is, class1& t); 

endif /* class1_hpp */ 

以下である私のオペレータ未満のオーバーロードされた(私はそれが最も簡潔または効率的ではありません知っている):

bool class1::operator< (const class1& t) 
{ 
    if (this->time_.tm_year < t.time_.tm_year) {return true;} 
    else if (this->time_.tm_year > t.time_.tm_year) {return false;} 
    else if (this->time_.tm_mon < t.time_.tm_mon) {return true;} 
    else if (this->time_.tm_mon > t.time_.tm_mon) {return false;} 
    else if (this->time_.tm_mday < t.time_.tm_mday) {return true;} 
    else if (this->time_.tm_mday > t.time_.tm_mday) {return false;} 
    else if (this->time_.tm_hour < t.time_.tm_hour) {return true;} 
    else if (this->time_.tm_hour > t.time_.tm_hour) {return false;} 
    else if (this->time_.tm_min < t.time_.tm_min) {return true;} 
    else if (this->time_.tm_min > t.time_.tm_min) {return false;} 
    else if (this->time_.tm_sec < t.time_.tm_sec) {return true;} 
    else {return false;} 
} 
+0

をさて、あなたはおそらく、あなたを使用する必要が関連する操作を宣言していませんマップキーとして入力します。 –

+1

'class1'のインターフェースを投稿できますか?また、「l」の定義は何ですか? – templatetypedef

+0

@KerrekSB私は割り当て、等価、より小さい、ストリームの抽出と挿入、そしてすべての通常のコンストラクタをオーバーロードしました。私が気付いていないものがありますか? – Zroach

答えて

2

問題がstd::map<key_type, value_type>が正しくkey_typeためoperator<を定義し、この場合には、あなたのoperator<は、このデータ構造は、コンパレータは変更しないことを必要とすることがstd::mapと互換性がないように、指定されたconstではないが必要なことですどのような方法でもキーオブジェクト。したがって、解決方法はclass1::operator<constとマークすることです。

2番目のエラーが何もハッシュ関数オブジェクトはstd::unordered_mapで使用するために適用されていないことを指摘し、これは次のようなフレームワークが必要となる:

auto class1_hasher = [](const class1& c) -> std::size_t { return {some hash based on c}; } 
std::unordered_map<class1, std::string, decltype(class1_hasher)> um; 
1

私はここでの問題は、あなたが必要な前提条件を破っているということだと思いますstd::mapおよびstd::unordered_mapインターフェイスの

std::mapでは、より小さい演算子を使用してキータイプを比較できる必要があります。これは、operator <のオーバーロードを提供するか、std::mapタイプを使用しているときにカスタムコンパレータを提供する必要があることを意味します。あなたがあなたのタイプでこれを行う方法を提供しなかったので、std::mapの内部実装は、それゆえ、あなたのエラーメッセージフォーム

somethingOfTypeClass1 < somethingElseOfTypeClass1 

コンパイルの発現を行うことができませんでした。

あなたはstd::unordered_mapに切り替えた場合std::unordered_mapでキーとして何かを格納するために、カスタムタイプにstd::hashテンプレートを特化する必要がある、のでunordered_mapの内部作品はタイプすることを必要とするので、あなたがトラブルに走りましたハッシュ可能です。それはあなたが得た2番目のエラーです。

は、この問題を解決するには、いずれかの

  1. はその後std::unordered_mapを使用し、その後、class1のカスタムstd::hashを定義するstd::map、または
  2. を使用し、class1のカスタムoperator <やコンパレータタイプを定義します。
+0

ありがとうございます。私はunordered_mapのハッシュ関数を定義していませんが、なぜstd :: mapがうまくいかないのか分からない理由があります。元の投稿の最後に追加しました。 – Zroach

+1

@Zroachあなたの '' '' const'' '' 'class'' :: operator {(const class1&t)const''を' 'std :: map''が動作するようにしてください。 – Paul

+0

@Paul、あなたは正しいです、ArchbishopofBanterburyは私のポストのコメントの上にそれを示唆し、それは答えでした。誰かが解決策にこれを含めるのを待っていますが、この回答は添付されたこれらのコメントと関係していると思います。おかげでポール。 – Zroach

0

私たちが機能要件を知るまでは、最良のデータ構造を示唆するのは難しいです。しかし、以下のコードはGCC 4.9.3で私のために働いています。 インクルードファイルと構文を確認してください。

#include <iostream> 
#include <string> 
#include <map> 
#include <unordered_map> 
#include <list> 

using namespace std; 

int main() 
{ 
//LIST 
std::list<int> myList; 
myList.push_front(1); 
myList.push_front(2); 
myList.push_front(3); 
myList.push_front(4);  

//STRING 
string s = "Test"; 

//MAP  
std::map <int, std::string> fullMap; 
for (std::list<int>::iterator x = myList.begin(); x != myList.end(); x++) 
{    
    fullMap.insert(std::make_pair(*x,s)); 

} 

//UNORDERED MAP  
std::unordered_map <int, std::string> fullUnorderedMap; 
for (std::list<int>::iterator y = myList.begin(); y != myList.end(); y++) 
{   
    fullUnorderedMap.insert(std::make_pair(*y,s)); 
} 

//PRINTING  
for(auto it = fullMap.begin(); it != fullMap.end(); ++it) 
{ 

    cout<<it->first<<"  "<<it->second<<endl; 

} 

for(auto it = fullUnorderedMap.begin(); it != fullUnorderedMap.end(); ++it) 
{ 

    cout<<it->first<<"  "<<it->second<<endl; 

} 

}

+0

問題のコードが更新されたため、マップのキータイプが適切な操作をサポートしていないという問題がありました。あなたは 'int'キーを使用しています。これは必要な操作をすべてサポートしているため、エラーがありません。 – templatetypedef

+0

私は同意します。コンパレータのオペレータを過負荷にする必要があります。 – Naidu

関連する問題