Как я могу передать векторную переменную в функцию? - PullRequest
0 голосов
/ 04 февраля 2011

Как мы можем передать vector переменные в функцию? У меня есть vector из char* и функция, которая будет принимать char * в качестве аргумента. Как я могу передать переменную vector этой функции?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

Если у вас есть функция, принимающая аргумент char *, то вы можете передать только один из char * в векторе.Например:

std::vector<char*> v;
char buf[] = "hello world";
v.push_back(buf);
the_function(v[0]);

Если вы хотите вызвать функцию для каждого члена в векторе, просто выполните цикл:

for (std::vector<char*>::iterator i = v.begin(); i != v.end(); ++i)
    the_function(*i);

РЕДАКТИРОВАТЬ: на основе вашего комментария ниже, вы действительно хотитенаписать функцию, которая принимает вектор в качестве аргумента ... try:

void the_function(const std::vector<char*>& v)
{
    // can access v in here, e.g. to print...
    std::cout << "[ (" << v.size() << ") ";
    for (std::vector<char*>::iterator i = v.begin(); i != v.end(); ++i)
         std::cout << *i << ' ';
    std::cout << " ]";
}

Если у вас есть существующая функция, которую вы хотите вызвать, и вы не хотите изменять список аргументов ...

void TV_ttf_add_row(const char*, const char*, const void*);

... тогда, скажем, вы знаете, что в векторе будет достаточно элементов:

assert(v.size() >= 3); // optional check...
TV_ttf_add_row(v[0], v[1], v[2]);

или

if (v.size() >= 3)
    TV_ttf_add_row(v[0], v[1], v[2]);

или, если вы хотите исключениеВыдается, если в v недостаточно элементов, а затем ...

try
{
    TV_ttf_add_row(v.at(0), v.at(1), v.at(2));
}
catch (const std::exception& e)
{
    std::cerr << "caught exception: " << e.what() << '\n';
}

(блок try / catch не должен окружать один вызов функции - до тех пор, пока v.at( ) вызовы находятся где-то внутри блока try или функции, вызываемой прямо или косвенно изнутри блока).

0 голосов
/ 04 февраля 2011

Если вам нужно передать содержимое std :: vector в функцию, которая принимает массив C, вы можете взять адрес первого элемента вектора:

void someCfunc(char *);

std::vector<char *> somevec;
// set up the vector ... then:
someCfunc(&somevec[0]);

ОДНАКО - будьте осторожны, здесь вы не перепутаете соглашение C-строки! std::vector не добавит '\0' к концу строки автоматически; Вы должны сделать это вручную. Если это просто байтовый буфер, вам нужно отдельно передать размер вектора. И если вы получаете данные обратно в вектор, функция C не может самостоятельно развернуть вектор, поэтому вы должны заранее убедиться, что вектор достаточно большой.

Обратите внимание, что это относится только к std::vector, а не к другим контейнерам STL.

0 голосов
/ 04 февраля 2011

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

void f(char* s)
{
    // do something with s
}

std::vector<char*> char_vect;
size_t len = char_vect.size();
for (size_t i=0; i<len; ++i)
    f(char_vect[i]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...