2016-11-27 10 views
1

私は2Dベクトルをエミュレートする1​​D charベクトルを持っています(これは要件です)。このベクトルは000111であり、ベクトルのベクトル[0] = 000とベクトル[1] = 111に相当します。したがって、同じ長さ(この場合は3)の2つの文字列があります。私はstd::unordered_mapでキーとしてすべての文字列を設定したいので、私はやっている:私は新しい文字列を構築して、マップにそれを挿入する必要があるため新しい文字列の作成を避けるにはどうすればよいですか?

#include <iostream> 
#include <unordered_map> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::unordered_map<std::string, int> mymap; 
    std::vector<char> keys(2 * 3); // 2 keys, each one of length 3 
    for(int i = 0; i < 2; ++i) 
    { 
    for(int j = 0; j < 3; ++j) 
    { 
     keys[j + i * 3] = (i) ? '1' : '0'; 
    } 
    } 
    // keys = 000111 

    for(int i = 0; i < 2; ++i) 
    { 
    mymap[std::string(keys.begin() + i * 3, keys.begin() + (i + 1) * 3)] = i; 
    } 

    for (auto& x: mymap) { 
    std::cout << x.first << ": " << x.second << std::endl; 
    } 

    /* 
    Output: 
    111: 1 
    000: 0 
    */ 

    return 0; 
} 

私は不幸になりました。もし私がそれを何かを忘れさせることができれば、それは素晴らしいことでしょう。私はできますか?

+1

*「建設は悪いですか?」*はい。 'char(0)!= '0'' –

+0

私の愚か@BaummitAugen、あなたは正しいです、私は質問を更新しました、再読してください! :) – gsamaras

+0

@gsamaras前と同じ問題です。 ;) 'keys [j + i * 3] =(i)を試してください。 '1': '0'; ' –

答えて

1

私はこれがC++ 17 string_viewの代わりになると思います。 string_viewの文字列のいずれかを所有していないので、constのネスが問題になることができます(マップの中に挿入するときのconstキャストを参照してください)

行うことがnedded変更のみが

  1. ましたconst-cast、これを解決する必要があります。
  2. マルチマップのタイプ。
  3. 注ちょうど#endifの

でusingステートメント私はちょうどあなたのコードに、クラス、ハッシュ構造体(STDで::!)と、いくつかのオーバーロードをボルトで固定。

#include <iostream> 
#include <unordered_map> 
#include <string> 
#include <vector> 
#ifdef HAS_STRING_VIEW 
#include <string_view> 
#else 

class lps_noz_view{ 
public: 
    lps_noz_view() = delete; 
    lps_noz_view(const char* start, size_t size):start(start), stop(start + size){} 
    lps_noz_view(const lps_noz_view&) = default; 
    lps_noz_view(lps_noz_view&&) = default; 
    const char* begin(){ return start;} 
    const char* end(){ return stop;} 
    const char* begin() const{ return start;} 
    const char* end() const{ return stop;} 
    std::string to_string() const{ return std::string(start, stop);} 
private: 
    const char* start; 
    const char* stop; 
}; 

bool operator < (const lps_noz_view& lhs, const lps_noz_view& rhs){ 
    return lhs.to_string() < rhs.to_string(); 
    // or use strncmp to avoid creating strings =) 
} 

bool operator == (const lps_noz_view& lhs, const lps_noz_view& rhs){ 
    return lhs.to_string() == rhs.to_string(); 
    // strncmp 
} 
std::ostream& operator << (std::ostream& os, const lps_noz_view& rhs){ 
    return os << rhs.to_string(); 
} 

namespace std{ 
template<> 
struct hash<lps_noz_view> 
{ 
    using argument_type = lps_noz_view; 
    using result_type = size_t; 
    size_t operator()(const lps_noz_view& arg) const{ 
     return std::hash<std::string>()(std::string(arg.begin(), arg.end())); 
    } 
}; 
}; 

using string_view = lps_noz_view; 
#endif 
// 
int main() 
{ 
    std::unordered_map<string_view, int> mymap; 
    std::vector<char> keys(2 * 3); // 2 keys, each one of length 3 
    for(int i = 0; i < 2; ++i) 
    { 
    for(int j = 0; j < 3; ++j) 
    { 
     keys[j + i * 3] = (i) ? '1' : '0'; 
    } 
    } 
    // keys = 000111 

    for(int i = 0; i < 2; ++i) 
    { 
    mymap[string_view(const_cast<const char*>(&(*keys.begin()) + i * 3), 
      (i + 1) * 3)] = i; 
    } 

    for (auto& x: mymap) { 
    std::cout << x.first << ": " << x.second << std::endl; 
    } 

    /* 
    Output: 
    111: 1 
    000: 0 
    */ 

    return 0; 
} 
+0

"または文字列の作成を避けるためにstrncmpを使用してください)"、キリンあなたは人間です。私は動物です!ニース。 – gsamaras

+1

私はそれが適切なコメントであると感じました=) –

関連する問題