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");
}