创建字符串数组/向量并找出其中所有字符串的长度的有效方法



我想创建一个函数,在该函数中,我可以迭代包含可变数量字符串的数组/向量,并且在将字符串发送到函数之前,我需要知道字符串的长度。我如何才能以有效的方式实现这一点?

我对这个函数有一些松散的想法,但我如何有效地向它发送一个字符串数组/向量,以及所有这些字符串的大小。例如,该函数可能看起来像这样:

myFunc(vector<string> s, int totalWordLength) {
// Loop over strings in vector.
}

我可以做这样的事情来创建一个字符串向量。

const char *args[] = {"12345", "678"};
vector<string> s(args, end(args));

但是,我如何在不循环的情况下找出其中字符串(8(的大小,以便将其发送到myFunc(s, sizeOfStrings)

如果您想通过使用数组或其他方法来获得相同的结果,请告诉我。我正在努力做到尽可能高效

遍历容器(与容器类无关(

const char *args[] = {"12345", "678"};
vector<string> s(args, end(args));
size_t sizOfS = 0;
for( auto& item : s )
sizOfS += item.length();

另一种将填充阵列和计算长度的过程统一起来的方法:

const char *args[] = {"12345", "678"};
std::vector<std::string> s;
s.reserve(sizeof(args)/sizeof(args[0]));
size_t sizOfS = 0;
for( const std::string& item : args )
{
sizOfS += item.length();
s.push_back(item);
}

不管您做什么,过程的成本都是O(n(,其中n = strings * their-total-length。并没有其他定义的方法,但有几个函数可以将循环变成一个线性。即使定义了自己的容器来跟踪字符串的长度,其成本也会有相同的顺序。

使用哪个容器取决于您期望执行的操作类型,vector获得了随机访问容器项的恒定成本,但线性增加了其存储的增长成本。列表可能有廉价的插入\推送成本,但它有顺序迭代器。

如果你想知道向量中所有字符串的长度并经常查询(这不是一次性的(,那么你可以计算字符串相加后的长度,并将总数存储在向量中。

一个类的快速示例:

class MyClassFoo {
public:
std::vector<std::string> items;
std::size_t total_item_sizes = 0;
void addItem(const std::string& item) {
total_item_sizes += item.length(); // Add its length to the total
items.emplace_back(item); // Add the item to the vector 
}
}

然后你可以传递这个对象并查询它

如果你想更有效地通过引用或移动一次性参数。这对于像std::vector这样的东西来说很重要,因为您可能不想复制它的所有元素。

顺便说一句,这实际上不太可能是所必需的,除非你经常尝试对所有字符串的长度求和,并且有很多字符串,否则你的瓶颈不会在std::vector上迭代。您对"效率"的需求闻起来像是过早的优化。记住20-80规则(80%的程序执行时间用于运行20%的代码(。

给定您的场景,一种方法可以是在构建向量时计算字符串的长度。

使用可变模板的一个解决方案可以是这样的包装器(实时(:

#include <iostream>
#include <vector>
#include <string>
struct V
{
template <typename ... T>
V( T&& ... t ) : v{ std::forward<T>(t)... }
{
for ( const auto& s : v ) size += s.size();
}
std::vector<std::string> v;
std::size_t size {0};
};
int main()
{
const char *args[] = { "12345678", "6789", "1234", "5678" };
V obj ( std::begin(args), std::end(args) );
std::cout << "No. of Strings : " << obj.v.size() << 'n';
std::cout << "Total Length   : " << obj.size << 'n';
return 0;
}

输出:

No. of Strings : 4
Total Length   : 20

最新更新