2014-12-20 3 views
-1

Так что мой вопрос заключается в следующем:Как я могу «назвать» элементы массива?

Учитывая мой массив

char *MyArray[] = {"string1","string2","string3","string4","string5","string6"}; 

Как я могу назвать строку1 так, что, когда я пытаюсь получить доступ к нему в массиве, я использую код, как показано ниже?

char *myString = MyArray[string1]; 
+5

Почему бы не использовать зЬй :: карту или зЬй :: unordered_map? – Borgleader

+0

укажите им имена int: p, или, используйте карту. – keyser

+0

'std :: map ' именно то, что вы хотите. – BWG

ответ

1

К сожалению, вы не можете делать такие вещи; Однако, вы можете попробовать следующее, так что вы знаете, что string1 без того, чтобы вернуться к заголовку, содержащими ваш массив:

enum ArrayNames : int 
{ 
    string1 = 0, 
    string2 = 1, 
    string3 = 2, 
    string4 = 3, 
    string5 = 4, 
    string6 = 5 
}; 

char *myString = MyArray[ArrayNames.string1]; 

Надеется, что это помогает любому, кто хочет сэкономить время при работе с массивами из :)

+2

Нет необходимости указывать базовый тип 'enum', если вы не планируете его хранить где-либо, или вам нужно переслать его объявить (и это только C++ 0x). Кроме того, оператор области - '::', а не '.' (что необязательно, если не объявлено класс перечисления,' string1' достаточно. Наконец, записи enum' должны быть заглавными. – Jack

0

Если вы хотите получить доступ к строкам по имени, просто введите некоторые переменные.

const string std::string 
string1 = "string1", 
string2 = "string2", 
string3 = "string3", 
string4 = "string4", 
string5 = "string5"; 

Вы ищете решение проблемы, которая не существует.

+0

Нежное неодобрение - таким образом, stringX может только be const string :: string, без (уникального) типа для сигнатур метода/функции. Если оба яблока и апельсины имеют одинаковый тип (т.е. const std :: string), автор имеет только уникальные имена методов, которые нужно выбрать, и компилятор не может сообщить, когда apple передал метод s, который принимает только оранжевые разновидности. –

+0

Вопрос только в том, чтобы искать строку по имени. –

0

Поскольку вопрос ясно о том, как получить доступ к индексу массива, элементы которого являются const char*,
я считаю, в приведенном ниже примере это простой и прямой подход с использованием ENUM.

#include <iostream> 
using namespace std; 

int main() 
{ 
    enum StringCodes { 
     STRING1, 
     STRING2, 
     STRING3, 
     STRING4, 
     STRING5, 
     STRING6 
    }; 

    const char *MyArray[] = 
       {"string1","string2","string3","string4","string5","string6"}; 
    const char *string1 = MyArray[STRING1]; 
    cout << string1; 

    return 0; 
} 

Вы можете использовать другой контейнер, например, std::map, который позволяет связать ключ с элементом:

map<string,const char*> myMap; 
myMap["string1"] = "string1"; 
myMap["string2"] = "string2"; 

cout << myMap["string1"]; 
+0

Нежное неодобрение - этот «стиль» создает патологическую зависимость между порядком перечислений и порядком MyArray [ ] элементов.Рассмотрим, когда много пар перечислимых строк. (Я видел> 500). Эта координация не должна быть ручным усилием. –

0

Вы можете сделать это с помощью С ++ std::map контейнер. Для карты требуется два типа данных. Первый - это ключ, а второй - значение, с которым связан ключ. Ключ - это то, что вы будете использовать для получения связанного значения.

std::map<std::string, std::string> map_of_strings; 

/** 
* Put your strings twice because the first is the key which 
* enables you to get the value using the string. The second 
* is the value. You can insert your key/values using any 
* one of the following methods: 
* 
* Method 1: 
* - Using std::pair which is the longer less pleasant 
* looking way of adding to a map. 
*/ 
map_of_strings.insert(std::pair<std::string, std::string>("string1", "string1")); 

/** 
* Method 2: 
* - Using std::make_pair so you don't have to provide 
* the two data types. Make pair will do it for you. 
*/ 
map_of_strings.insert(std::make_pair("string2", "string2")); 

/** 
* Method 3: 
* - Using emplace instead of insert. Emplace provides 
* the same end result that insert does which is adding 
* new pairs of data. However, emplace utilizies rvalues 
* instead of creating a copy the given key/value. For 
* more detailed information about the difference between 
* insert and emplace, take a look at the stack article i've 
* provided a link to below this code. 
*/ 
map_of_strings.emplace(std::pair<std::string, std::string>("string3", "string3")); 

/** 
* Method 4: 
* - Basically the same as method 3 
*/ 
map_of_strings.emplace(std::make_pair("string4", "string4")); 

/** 
* Method 5: 
* - Using square brackets like you would with an array 
*/ 
map_of_strings["string5"] = "string5"; 

/** 
* Method 6: 
* - Using curly braces to declare single or multiple key/value pairs. 
*/ 
map_of_strings = {{"string6", "string6"}, {"string7", "string7"}}; 

// Get string1 from the map - Tada! 
std::string str = map_of_strings["string1"]; 

Difference between insert, emplace, and []

+0

Всегда лучше включать какой-то описательный текст, например «Вы можете выполнить это с помощью ассоциативности, как [' std :: map'] (http://en.cppreference.com/w/cpp/container/map) » с некоторым фоном о конкретных контейнерах (контейнерах). Также рассмотрите возможность использования '' std :: make_pair ("string1", "string1 ')'] (http://en.cppreference.com/w/cpp/utility/pair/make_pair) вместо 'std :: pair <> 'и включая примеры для [' map_of_strings.emplace ("string1", "string1 ')'] (http://en.cppreference.com/w/cpp/container/map/emplace) и инициализации скобки 'T map_of_strings = {{"string1", "string1"}} '. –

+0

Спасибо за отзыв. – th3v0id

Смежные вопросы