У меня есть функция API, которая ожидает char***
параметр и хотите передать vector<std::string>
,
Есть ли функции-члены std::string
что позволило мне сделать это?
Таким образом, я получаю только указатель на первый элемент:
std::vector<std::string> oList(128);
myFunction(oList[0].c_str());
«Есть ли функции-члены std :: string, которые позволяют мне это делать?»
Короче говоря: нет.
Тот std::vector<std::string>
хранит std::string
экземпляры в непрерывном массиве, не означает, что указатели на основной char
массивы этих строковых экземпляров появляются непрерывно в памяти.
Невозможно привести весь вектор к массиву указателей на указатели. Вы можете лечить активную часть vector
как если бы это был массив элементов вектора, но в этом случае это был бы массив string
объекты, а не указатели на char*
, Попытка переосмыслить это как что-либо еще было бы неопределенным.
Если вы уверены, что API не будет касаться содержимого char*
строки (например, потому что это const
) вы можете создать массив указателей и вывести результаты c_str()
на vector
элементы в это, как это:
char **pList = new char*[oList.size()];
for (int i = 0 ; i != oList.size() ; i++) {
pList[i] = oList[i].c_str();
}
myTrippleStarFunction(&pList); // Use & to add an extra level of indirection
delete[] pList;
Однако вы должны быть очень осторожны, передавая массив, подобный этому, в API, который использует дополнительный уровень косвенности, потому что может потребоваться третья звездочка, чтобы изменить указатель, который вы передаете, например, путем перераспределения массива. В этом случае вам может потребоваться использовать другой механизм для выделения динамической памяти в соответствии с механизмом, используемым вашим API.