gpt4 book ai didi

c++ - 使用 for_each 遍历以 NULL 结尾的字符串数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:22 25 4
gpt4 key购买 nike

可以使用 for_each 遍历以 NULL 结尾的字符串:

const char *name = "Bob";

void func(const char &arg)
{
cout << arg;
}

int main()
{
for_each(name, name + strlen(name), func);
}

对于以 NULL 结尾的字符串列表(无需先确定列表的总长度)是否有类似的可能,例如:

const char *names[] = { "Bob", "Adam", "Simon", NULL };

最佳答案

std::for_each 在一个范围内“迭代”,因此要将它与不确定长度的数组一起使用,您需要使用自定义迭代器来指示数组的结尾(在 NULL 成员上)。如果您坚持使用以 NULL 结尾的 char* 数组,您当然可以为它创建自己的 for_each 函数,例如:

template <typename Function>
void for_each_in_null_terminated_cstring_array(const char** array, Function f)
{
while (*array) {
f(*array);
array++;
}
}

const char *names[] = { "Bob", "Adam", "Simon", NULL };
for_each_in_null_terminated_cstring_array(names, func);

不过,我并不是真的推荐这种解决方案。

编辑:是的,越通用总是越好,不是吗?

template <typename T, typename Function>
void for_each_in_null_terminated_array(T* array, Function f)
{
while (*array) {
f(*array);
array++;
}
}

(这是我之前提到的空终止(“false”终止)迭代器的实现——根据下面的建议进行了一两次更改。它应该是一个真正的 InputIterator)

template <class T>
class nt_iterator: public std::iterator<std::input_iterator_tag, T>
{
public:
typedef typename nt_iterator<T>::pointer pointer;
typedef typename nt_iterator<T>::value_type value_type;

nt_iterator(): p(), pte(true) {}
nt_iterator(pointer p_): p(p_), pte(!p_) {}
nt_iterator(const nt_iterator<T>& rhs): p(rhs.p), pte(rhs.pte) {}
nt_iterator<T>& operator++() {
++p;
if (!*p) pte = true; // once past-the-end, always past-the-end
return *this;
}
nt_iterator<T> operator++(int) {
nt_iterator n(*this);
operator++();
return n;
}
bool operator==(const nt_iterator<T>& rhs) {
return pte && rhs.pte || p == rhs.p;
}
bool operator!=(const nt_iterator<T>& rhs) {
return !(operator==(rhs));
}
value_type operator*() { return *p; }

private:
pointer p;
bool pte; // past-the-end flag
};

以及它的使用方式:

void print(const char* str);

int main()
{
const char* array[] = {"One", "Two", "Three", NULL, "Will you see this?"};
std::for_each(nt_iterator<const char*>(array),
nt_iterator<const char*>(),
print);
}

它可能比循环版本慢一点,因为增加了等价性检查的数量 - 速度差异当然与打印文本相比微不足道 - 但应该注意 std::for_each 确实不会神奇地使循环更快(事实上,您可能会惊讶地看到您的编译器供应商如何定义该函数 - 也就是说,如果您期望过高)。

关于c++ - 使用 for_each 遍历以 NULL 结尾的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com