C++ 如何迭代std::vector<;char>;并查找以null结尾的c字符串

C++ 如何迭代std::vector<;char>;并查找以null结尾的c字符串,c++,stdvector,C++,Stdvector,基于以下代码片段,我有三个问题 我有一个字符串列表。它只是一个向量,但可能是任何源 vector<string> v1_names = boost::assign::list_of("Antigua and Barbuda")( "Brasil")( "Papua New Guinea")( "Togo"); 问题:这是估算存储量的最佳方法吗?我将最大长度固定在20,这样就可以了,然后为空震颤器添加空间 现在复制名称 for( std::vector<std::string&

基于以下代码片段,我有三个问题
我有一个字符串列表。它只是一个向量,但可能是任何源

vector<string> v1_names = boost::assign::list_of("Antigua and Barbuda")( "Brasil")( "Papua New Guinea")( "Togo");
问题:这是估算存储量的最佳方法吗?我将最大长度固定在20,这样就可以了,然后为空震颤器添加空间
现在复制名称

for( std::vector<std::string>::size_type i = 0; i < v1_names.size(); ++i)
{
    std::string val( v1_names[i] );
    name_len.push_back(val.length());
    for(std::string::iterator it = val.begin(); it != val.end(); ++it)
    {
        v2_names.push_back( *it );
    }
    v2_names.push_back('\0');
}
for(std::vector::size_type i=0;i
问题:这是将元素从v1\u名称复制到v2\u名称的最有效方法吗?

主要问题:如何迭代v2\u名称并打印v2\u名称中包含的国家名称

计算所需存储量的最佳方法是将
v1\u名称中每个字符串的长度相加

对于第二个问题,不使用For循环,只需在字符串上使用向量的
迭代器、迭代器
append方法和
开始
结束


关于你的第三个问题:不要那样做。迭代
v1\u名称
的字符串。创建像
v2\u name
这样的东西的唯一原因是将它传递到一个遗留的C API中,然后您就不必担心对它进行迭代。

计算所需存储的最佳方法是将
v1\u name
中每个字符串的长度相加

对于第二个问题,不使用For循环,只需在字符串上使用向量的
迭代器、迭代器
append方法和
开始
结束


关于你的第三个问题:不要那样做。迭代
v1\u名称
的字符串。创建
v2\u names
这样的东西的唯一原因是将它传递到一个遗留的C API中,然后您就不必担心对它进行迭代了。

如果您想连接所有字符串,您可以只使用一个传递并依赖于摊销的O(1)插入:

name_len.reserve(v1_names.size());

// v2_names.reserve( ??? ); // only if you have a good heuristic or
                            // if you can determine this efficiently

for (auto it = v1_names.cbegin(); it != v1_names.cend(); ++it)
{
  name_len.push_back(it->size());
  v2_names.insert(v2_names.end(), it->c_str(), it->c_str() + it->size() + 1);
}

在此之前,您可以通过另一个循环预先计算总长度,如果您认为这会有所帮助,可以调用
reserve
。这取决于你对弦的了解程度。但是,也许没有必要担心,因为从长远来看,插入是O(1)。

如果您想连接所有字符串,您可以只使用一次传递并依赖于摊销的O(1)插入:

name_len.reserve(v1_names.size());

// v2_names.reserve( ??? ); // only if you have a good heuristic or
                            // if you can determine this efficiently

for (auto it = v1_names.cbegin(); it != v1_names.cend(); ++it)
{
  name_len.push_back(it->size());
  v2_names.insert(v2_names.end(), it->c_str(), it->c_str() + it->size() + 1);
}

在此之前,您可以通过另一个循环预先计算总长度,如果您认为这会有所帮助,可以调用
reserve
。这取决于你对弦的了解程度。但也许没有必要担心,因为从长远来看,插入是O(1)。

要估计存储,您可能应该测量字符串,而不是依赖硬编码的常量20。例如:

size_t total = 0;
for (std::vector<std::string>::iterator it = v1_names.begin(); it != v1_names.end(); ++it) {
    total += it->size() + 1;
}
这并不一定是最有效的,因为对向量中的可用空间有一定量的冗余检查,但这应该不会太糟糕,而且很简单。另一种方法是在开始时调整
v2_名称的大小,而不是保留空间,然后复制数据(使用
std::copy
),而不是附加数据。但是他们中的任何一个都可能更快,而且不会有太大的区别

对于主要问题,如果您只有
v2\u名称
,并且希望打印字符串,则可以执行以下操作:

const char *p = &v2_names.front();
while (p <= &v2_names.back()) {
    std::cout << p << "\n";
    p += strlen(p) + 1;
}

请注意,
name\u len
的类型在技术上是错误的-不能保证您可以在
int
中存储字符串长度。也就是说,即使在特定的实现中
int
小于
size\t
,那么大的字符串仍然非常罕见。

要估计存储量,您可能应该测量字符串,而不是依赖硬编码常量20。例如:

size_t total = 0;
for (std::vector<std::string>::iterator it = v1_names.begin(); it != v1_names.end(); ++it) {
    total += it->size() + 1;
}
这并不一定是最有效的,因为对向量中的可用空间有一定量的冗余检查,但这应该不会太糟糕,而且很简单。另一种方法是在开始时调整
v2_名称的大小,而不是保留空间,然后复制数据(使用
std::copy
),而不是附加数据。但是他们中的任何一个都可能更快,而且不会有太大的区别

对于主要问题,如果您只有
v2\u名称
,并且希望打印字符串,则可以执行以下操作:

const char *p = &v2_names.front();
while (p <= &v2_names.back()) {
    std::cout << p << "\n";
    p += strlen(p) + 1;
}

请注意,
name\u len
的类型在技术上是错误的-不能保证您可以在
int
中存储字符串长度。也就是说,即使在特定实现中
int
小于
size\u t
,那么大的字符串仍然非常罕见。

使用简单连接,获利

#include <boost/algorithm/string/join.hpp>
#include <vector>
#include <iostream>

int main(int, char **)
{
    vector<string> v1_names = boost::assign::list_of("Antigua and Barbuda")( "Brasil")( "Papua New Guinea")( "Togo");

    std::string joined = boost::algorithm::join(v1_names, "\0");
}
#包括
#包括
#包括
int main(int,char**)
{
vector v1_names=boost::assign::list_of(“安提瓜和巴布达”)(“巴西”)(“巴布亚新几内亚”)(“多哥”);
std::string join=boost::algorithm::join(v1_名称,“\0”);
}

使用简单连接,获利

#include <boost/algorithm/string/join.hpp>
#include <vector>
#include <iostream>

int main(int, char **)
{
    vector<string> v1_names = boost::assign::list_of("Antigua and Barbuda")( "Brasil")( "Papua New Guinea")( "Togo");

    std::string joined = boost::algorithm::join(v1_names, "\0");
}
#包括
#包括
#包括
int main(int,char**)
{
vector v1_names=boost::assign::list_of(“安提瓜和巴布达”)(“巴西”)(“巴布亚新几内亚”)(“多哥”);
std::string join=boost::algorithm::join(v1_名称,“\0”);
}

我真的很想迭代v2\u名称。事实上,这是主要问题。v1_names只是我的字符串的一个源的示例。目标是v2\u名称。我确实希望迭代v2\u名称。事实上,这是主要问题。v1_names只是我的字符串的一个源的示例。目标是v2_name。我希望您可以使用存储在
name_len
中的信息来计算偏移量,但找不到可行的方法this@samra:啊,你手上有
name\u len
v2\u name
#include <boost/algorithm/string/join.hpp>
#include <vector>
#include <iostream>

int main(int, char **)
{
    vector<string> v1_names = boost::assign::list_of("Antigua and Barbuda")( "Brasil")( "Papua New Guinea")( "Togo");

    std::string joined = boost::algorithm::join(v1_names, "\0");
}