我的代码如下:
std::cin >> str;
for ( char c : str )
if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str
Run Code Online (Sandbox Code Playgroud)
这可行吗?或者我将不得不与老派进行循环?
假设您想要在迭代不提供随机访问迭代器的容器时知道元素的数字索引.例如:
std::list<std::string> items;
int i = 0;
for (auto & item : items) item += std::to_string(i++);
Run Code Online (Sandbox Code Playgroud)
是否有更惯用或更好的方式来做到这一点?我认为这种模式会出现在各种情况下.我不喜欢在循环之外可用的整数索引.包围循环和本地块中的索引定义似乎也很难看.
当然,当容器提供随机访问迭代器时,可以利用迭代器差异,但是你不能使用range-for:
std::vector<std::string> items;
for (auto it = items.begin(); it != items.end(); ++it)
*it += std::to_string(it - items.begin());
Run Code Online (Sandbox Code Playgroud)
虽然我只展示了C++ 11的例子,但我也在寻找C++ 0x和C++ 98的提示.
可能重复:
在C++ 11范围内查找元素的位置for循环?
我有一个vector,我想迭代它,同时,可以访问每个单独元素的索引(我需要将元素及其索引传递给函数).我考虑过以下两种解决方案:
std::vector<int> v = { 10, 20, 30 };
// Solution 1
for (std::vector<int>::size_type idx = 0; idx < v.size(); ++idx)
foo(v[idx], idx);
// Solution 2
for (auto it = v.begin(); it != v.end(); ++it)
foo(*it, it - v.begin());
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更紧凑的解决方案.与Python的枚举类似的东西.这是我使用C++ 11范围循环时最接近的,但是必须在私有范围内定义循环外的索引,这似乎比1或2更糟糕的解决方案:
{
int idx = 0;
for (auto& elem : v)
foo(elem, idx++);
}
Run Code Online (Sandbox Code Playgroud)
是否有任何方法(可能使用Boost)以这样的方式简化最新的示例,使索引自包含到循环中?
在Python中enumerate,有一个序列/迭代器,并产生一对整数索引和值本身.在C++中,我偶尔会发现自己写作
for (size_t i = 0; i != vector.size(); ++i) {
auto const &elem = vector[i];
// ...
Run Code Online (Sandbox Code Playgroud)
与Python类似,我想写
for (auto const &it : enumerate(vector)) {
// it.first is the index (size_t)
// it.second is the element (T const&)
Run Code Online (Sandbox Code Playgroud)
这样的enumerate存在于STL还是像Boost这样的公共库中?
是否有python习语的C++类似物:
for i, v in enumerate(listVar):
Run Code Online (Sandbox Code Playgroud)
即我想迭代访问索引和我正在迭代的容器的值.
有没有相当于enumerateC++中python 的基于范围的循环?我会想象这样的事情.
enumerateLoop (auto counter, auto el, container) {
charges.at(counter) = el[0];
aa.at(counter) = el[1];
}
Run Code Online (Sandbox Code Playgroud)
可以使用模板或宏来完成吗?
我知道我可以使用旧学校循环并迭代直到我到达container.size().但我很感兴趣如何使用模板或宏来解决这个问题.
编辑
在评论中提示后,我使用了增强迭代器.我使用C++ 14获得了另一个有效的解决方案.
template <typename... T>
auto zip(const T &... containers) -> boost::iterator_range<boost::zip_iterator<
decltype(boost::make_tuple(std::begin(containers)...))>> {
auto zip_begin =
boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
auto zip_end =
boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
return boost::make_iterator_range(zip_begin, zip_end);
}
template <typename T>
auto enumerate(const T &container) {
return zip(boost::counting_range(0, static_cast<int>(container.size())),
container);
}
Run Code Online (Sandbox Code Playgroud)
可能重复:
std :: vector元素是否保证是连续的?
我遇到过一种技术,人们在C++中使用向量来接收或发送MPI操作的数据,因为它据说将元素连续存储在内存中.
但是,我仍然怀疑这种方法对于任何大小的向量是否都会保持稳健,特别是当向量增长到一定大小时,这种假设可能会崩溃.
以下是我所说的一个例子:
MPI_Recv( &partials[0] , partials.size() , mpi_partial , 0,
DALG_ELIMINATE_REQ_MSG ,MPI_COMM_WORLD , &status );
Run Code Online (Sandbox Code Playgroud)