2016-11-27 10 views
1

У меня есть вектор 1D char, эмулирующий 2D-вектор (это требование). Этот вектор равен 000111 и эквивалентен вектору [0] = 000 и вектору [1] = 111 2D. Таким образом, он имеет две строки, одинаковые длины (в этом случае 3). Я хочу, чтобы установить каждую строку в качестве ключа в 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 не владеет каким-либо из строк, так сопзИте-ность может быть проблема (см константного-Cast при вставке в карту)

Единственные изменения, которые nedded быть сделано были

  1. const-cast, вам придется решить эту проблему.
  2. тип мультимапа.
  3. Отметьте, используя заявление только на #endif

Я просто болты класса, хэш-структуру (в станде ::!) И несколько перегрузок на ваш код.

#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

Я чувствовал, что это был соответствующий комментарий =) –