Как объявить массив строк в C++?

Вы можете попробовать этот код в своем основном классе. Это сработало для меня, но я использовал методы другим способом

try {
    String receivedData = new AsyncTask().execute("http://yourdomain.com/yourscript.php").get();
} 
catch (ExecutionException | InterruptedException ei) {
    ei.printStackTrace();
}
86
задан LogicStuff 22 December 2015 в 19:18
поделиться

13 ответов

Эти повышение присваивается, библиотека , кажется, точно, что Вы ищете. Это делает константы присвоения к контейнерам легче чем когда-либо.

26
ответ дан Craig H 24 November 2019 в 07:58
поделиться
#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}
2
ответ дан 24 November 2019 в 07:58
поделиться

Вот пример:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

int main() {
    const char* const list[] = {"zip", "zam", "bam"};
    const size_t len = sizeof(list) / sizeof(list[0]);

    for (size_t i = 0; i < len; ++i)
        std::cout << list[i] << "\n";

    const std::vector<string> v(list, list + len);
    std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));
}
3
ответ дан Shadow2531 24 November 2019 в 07:58
поделиться

Вместо того макроса, мог бы я предлагать этого:

template<typename T, int N>
inline size_t array_size(T(&)[N])
{
    return N;
}

#define ARRAY_SIZE(X)   (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)

1) Мы хотим использовать макрос для создания его временем компиляции постоянный; результатом вызова функции не является постоянное время компиляции.

2) Однако мы не хотим использовать макрос, потому что макрос мог случайно использоваться на указателе. Функция может только использоваться на массивах времени компиляции.

Так, мы используем определенный мыс функции для создания макроса "безопасным"; если функция существует (т.е. она имеет ненулевой размер), тогда, мы используем макрос как выше. Если функция не существует, мы возвращаем плохое значение.

2
ответ дан DrPizza 24 November 2019 в 07:58
поделиться

Можно использовать begin и end функции из библиотеки диапазона Повышения для легкого нахождения концов примитивного массива, и в отличие от макро-решения, это даст ошибку компиляции вместо поврежденного поведения при случайном применении его к указателю.

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));
4
ответ дан LogicStuff 24 November 2019 в 07:58
поделиться

Попробованный к upvote ответу H Craig, что необходимо использовать повышение:: присвойтесь, но у меня нет представителя: (

я встретился с подобной техникой в первой статье, которую я когда-либо читал Andrei Alexandrescu в Пользовательский Журнал C/C++, Vol 16, № 9, сентябрь 1998, стр 73-74 (имейте полную цитату, потому что это находится в комментариях моей реализации его кода, который я использовал с тех пор).

Шаблоны являются Вашим другом.

3
ответ дан mlbrock 24 November 2019 в 07:58
поделиться

проблемы - никакой способ получить количество строк автоматически (что я знаю о).

существует стандартный трясиной способ сделать это, для которого много людей (включая MS) определяет макросы как arraysize:

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))
23
ответ дан LogicStuff 24 November 2019 в 07:58
поделиться

Одна возможность состоит в том, чтобы использовать Нулевого указателя в качестве флагового значения:

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}
7
ответ дан Eclipse 24 November 2019 в 07:58
поделиться

C++ 11 добавленных инициализаций перечисляет для разрешения следующего синтаксиса:

std::vector<std::string> v = {"Hello", "World"};

Поддержка этого C++ 11 опций были добавлены в [по крайней мере 111] GCC 4.4 и только в Visual Studio 2013 .

107
ответ дан Anthony Cramp 24 November 2019 в 07:58
поделиться

Можно кратко инициализировать vector<string> от статически созданного char* массив:

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

Это копирует все строки, между прочим, таким образом, Вы используете дважды память. Можно использовать предложение Will Dean для замены магического числа 3 здесь с arraysize (str_array) - хотя я не забываю там быть некоторым особым случаем, в котором та конкретная версия arraysize могла бы сделать Что-то Плохо (извините, я не могу сразу помнить детали). Но это очень часто работает правильно.

кроме того, если Вы действительно фанатичны об одной штуке строки, можно определить variadic макрос так, чтобы одна строка такой как DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); работы.

36
ответ дан Tyler 24 November 2019 в 07:58
поделиться

можно использовать предложение [#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] Will Dean для замены магического числа 3 здесь с arraysize (str_array) - хотя я не забываю там быть некоторым особым случаем, в котором та конкретная версия arraysize могла бы сделать Что-то Плохо (извините, я не могу сразу помнить детали). Но это очень часто работает правильно.

случай, где это не работает, - когда "массив" является действительно просто указателем, не фактическим массивом. Кроме того, из-за пути массивы передаются функциям (преобразованный в указатель на первый элемент), это не работает через вызовы функции, даже если подпись похожа на массив — some_function(string parameter[]) действительно some_function(string *parameter).

3
ответ дан Matthew Crumley 24 November 2019 в 07:58
поделиться

Корректный путь состоит в том, чтобы объявить массив обозначенного типа. Ниже пример для ссылки.

std::vector<std::string> v = {"Array", "String"};
-1
ответ дан 24 November 2019 в 07:58
поделиться
#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>

int main()
{
    const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
    std::copy(
        v.begin(),
        v.end(),
        std::ostream_iterator< std::string >( std::cout, "\n" ) );
}
1
ответ дан 24 November 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: