我想创建一个函数,在该函数中,我可以迭代包含可变数量字符串的数组/向量,并且在将字符串发送到函数之前,我需要知道字符串的长度。我如何才能以有效的方式实现这一点?
我对这个函数有一些松散的想法,但我如何有效地向它发送一个字符串数组/向量,以及所有这些字符串的大小。例如,该函数可能看起来像这样:
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