【发布时间】:2013-02-15 11:01:53
【问题描述】:
我的代码如下:
std::cin >> str;
for ( char c : str )
if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str
这可行吗?或者我将不得不使用老式的 for 循环?
【问题讨论】:
标签: c++ for-loop c++11 iteration
我的代码如下:
std::cin >> str;
for ( char c : str )
if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str
这可行吗?或者我将不得不使用老式的 for 循环?
【问题讨论】:
标签: c++ for-loop c++11 iteration
您可以在 c++11 中使用 lambda:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main() {
std::string str;
std::vector<char> v;
auto inserter = std::back_insert_iterator<decltype(v)>(v);
std::cin >> str;
//If you don't want to read from input
//str = "aaaaabcdecccccddddbb";
std::copy_if(str.begin(), str.end(), inserter, [](const char c){return c == 'b';});
std::copy(v.begin(),v.end(),std::ostream_iterator<char>(std::cout,","));
std::cout << "Done" << std::endl;
}
【讨论】:
假设str 是std::string 或其他具有连续存储的对象:
std::cin >> str;
for (char& c : str)
if (c == 'b') v.push_back(&c - &str[0]);
【讨论】:
it - vector.begin()之类的东西,你解决了我的问题!谢谢!
&it - &vector[0] 来编译。但是有没有像@ShaneHsu 的评论这样的好方法?我想通了,我必须使用 &it - vector.begin() 使用迭代器,例如 const initializer_list<double>& it。然而,在for(const pair<double, int>& it : vector_of_pairs) 这样的循环中,这会产生错误:no match for 'operator-'(操作数类型是 'const paircontainer.end()的相等性,或者获取下一个,等等。见stackoverflow.com/a/43680932/340947
std::vector(至少从评论中可以看出,因为从那时起已经有一段时间了)。因此,它将具有我需要的顺序,但显然表达式 &it - vector_of_pairs.begin() 不起作用,即使我希望指针算法能够工作,因为它是连续存储的。但是,我已经记不起确切的情况了。
也许有一个变量i就足够了?
unsigned i = 0;
for ( char c : str ) {
if ( c == 'b' ) vector.push_back(i);
++i;
}
这样您就不必更改基于范围的循环。
【讨论】:
index。
index 之类的内容。语言是否可以扩展以及如何扩展是一个不同的问题,不属于这里。
范围循环不会给你索引。它旨在抽象出这些概念,并让您遍历集合。
【讨论】:
您所描述的在其他语言中被称为“每个都有索引”操作。进行一些快速的谷歌搜索,似乎除了“老派 for 循环”之外,您还有一些相当复杂的解决方案,涉及 C++0x 兰巴或可能一些 Boost 提供的 gem。
编辑:例如,请参阅question
【讨论】: