Ответ 1
повысить назначение библиотеки, похоже, именно то, что вы ищете. Он упрощает назначение констант контейнерам, чем когда-либо.
Я пытаюсь перебрать все элементы статического массива строк наилучшим образом. Я хочу, чтобы иметь возможность объявить его на одной строке и легко добавлять/удалять элементы из него, не отслеживая число. Звучит очень просто, не так ли?
Возможные нерешения:
vector<string> v;
v.push_back("abc");
b.push_back("xyz");
for(int i = 0; i < v.size(); i++)
cout << v[i] << endl;
Невозможно создать вектор в одной строке со списком строк
Возможное не решение 2:
string list[] = {"abc", "xyz"};
Проблемы - нет возможности автоматически получить количество строк (что я знаю).
Должен быть простой способ сделать это.
повысить назначение библиотеки, похоже, именно то, что вы ищете. Он упрощает назначение констант контейнерам, чем когда-либо.
С++ 11 добавлены списки инициализации, чтобы разрешить следующий синтаксис:
std::vector<std::string> v = {"Hello", "World"};
Поддержка этой функции С++ 11 была добавлена как минимум GCC 4.4 и только в Visual Studio 2013.
Вы можете кратко инициализировать vector<string>
из статически созданного массива char*
:
char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);
Это копирует все строки, между прочим, поэтому вы дважды используете память. Вы можете использовать предложение Уилла Дина заменить магическое число 3 здесь на arraysize (str_array) - хотя я помню, что есть какой-то особый случай, когда эта конкретная версия arraysize может сделать что-то плохое (извините, я не могу сразу запомнить детали), Но он очень часто работает правильно.
Кроме того, если вы действительно играете в одну строку, вы можете определить переменный макрос, чтобы работала одна строка, такая как DEFINE_STR_VEC(strvector, "hi", "there", "everyone");
.
Проблемы - нет возможности автоматически получить число строк (что я знаю).
Существует стандартный способ выполнения ботов, который многие люди (включая MS) определяют макросы типа arraysize
для:
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
Объявите массив строк в С++ следующим образом: char array_of_strings[][]
Например: char array_of_strings[200][8192];
будет содержать 200 строк, каждая строка которых имеет размер 8kb или 8192 байта.
используйте strcpy(line[i],tempBuffer);
для размещения данных в массиве строк.
Одна возможность - использовать указатель NULL в качестве значения флага:
const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
cout << *iList;
}
Вы можете использовать функции begin
и end
из библиотеки диапазонов Boost, чтобы легко находить концы примитивного массива, и в отличие от решения макросов это приведет к ошибке компиляции вместо нарушения поведения, если вы случайно примените это указатель.
const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));
Вы можете использовать предложение Will Dean [
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
], чтобы заменить магическое число 3 здесь на arraysize (str_array) - хотя я помню, что есть какой-то особый случай, когда эта конкретная версия arraysize может сделать что-то плохое (извините, я не может сразу запомнить данные). Но он очень часто работает правильно.
Случай, когда он не работает, - это когда "массив" - это просто указатель, а не фактический массив. Кроме того, из-за того, как массивы передаются в функции (преобразуются в указатель на первый элемент), он не работает через вызовы функций, даже если подпись выглядит как массив — some_function(string parameter[])
действительно some_function(string *parameter)
.
Пытался перевернуть Craig H ответить, что вы должны использовать boost:: assign, но у меня нет rep: (
Я столкнулся с подобной техникой в первой статье, которую я когда-либо читал Андреем Александреску в журнале C/С++ Users Journal, том 16, № 9, сентябрь 1998 г., стр. 73-74 (есть полная цитата, потому что она в комментариях моя реализация его кода, который я использовал с тех пор).
Шаблоны - ваш друг.
Вот пример:
#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"));
}
Вместо этого макроса я могу предложить следующее:
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) Однако мы не хотим использовать макрос, потому что макрос может быть случайно использован на указателе. Функция может использоваться только для массивов времени компиляции.
Итак, мы используем определенную функцию, чтобы сделать макрос "безопасным"; если функция существует (т.е. имеет ненулевой размер), то мы используем макрос, как указано выше. Если функция не существует, мы возвращаем плохую величину.
#include <boost/foreach.hpp>
const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
cout << str << endl;
}
#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" ) );
}
#include <iostream.h>
#include <iomanip.h>
int main()
{
int n;
cout<<"enter the maximum number\n";
cin>>n;
cout<<"enter the first number\n";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
cout<<"enter the second number\n";
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
cin>>b[i][k];
}
}
cout<<"the product will be\n";
for(int i=0;i<n;i++)
{
for(int g=0;g<n;g++)
{
c[i][g]=c[i][c]*c[i][j];
cout<<setw(5)<<c[i][g];
}
cout<<endl;
}
return 0;
}
Вы можете напрямую объявить массив строк, например string s[100];
.
Затем, если вы хотите получить доступ к определенным элементам, вы можете получить его прямо как s[2][90]
. Для целей итерации возьмите размер строки, используя
s[i].size()
.