使用for_each函数显示每个容器元素

时间:2015-10-30 09:07:03

标签: c++

我想更多地了解模板。我试着编写自己的函数,它显示了每个容器元素。

 public class Refreshtable  extends Application {
  @FXML
   private TextField fname;
    private final TableView<Person> table = new TableView<>();
   private final ObservableList<Person> data =
            FXCollections.observableArrayList(
            new Person("Jacob"));
   final HBox hb = new HBox();
 public static void main(String[] args) {
        launch(args);
    }
     @Override
    public void start(Stage primarystage) {
        Scene scene = new Scene(new Group());
//        this.primaryStage.setTitle("Table View Sample");
      primarystage.setWidth(450);
     primarystage.setHeight(550);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));

        table.setEditable(true);

        TableColumn firstNameCol = new TableColumn("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory("firstName"));
 table.setItems(data);
        table.getColumns().addAll(firstNameCol);
    final Button addButton = new Button("Add");
        addButton.setOnAction((ActionEvent e) -> {
          System.out.println("u entered");
           try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(Refreshtable.class.getResource("newaddframe.fxml"));
     AnchorPane anchorpane = (AnchorPane) loader.load();
       Stage dialogStage = new Stage();
        dialogStage.setTitle("Main");
            dialogStage.initModality(Modality.WINDOW_MODAL);
       Scene scenee = new Scene(anchorpane);
            dialogStage.setScene(scenee);
dialogStage.showAndWait();
           } catch (IOException es) {
            es.printStackTrace();}
        });
        hb.getChildren().addAll(addButton);
         final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll( table, hb);

        ((Group) scene.getRoot()).getChildren().addAll(vbox);

  primarystage.setScene(scene);
        primarystage.show();
    }
    @FXML
    private void addd(){
    data.add(new Person(
                    fname.getText()));
            fname.clear();

            }
 public static class Person {
 private final SimpleStringProperty firstName;
 private Person(String fName) {
 this.firstName = new SimpleStringProperty(fName);
         }
 public String getFirstName() {
            return firstName.get();
        }
 public void setFirstName(String fName) {
            firstName.set(fName);
        }


    }
} 

我的show_element函数尚未通用。我如何编写它,以便我可以将它用于不同的容器类型?

void show_element(int i){
std::cout << i << endl;
}

int main(){

int dataarr[5]={1,4,66,88,9};
vector<int> data(&daten[0],&daten[0]+5);

std::for_each(data.begin(),data.end(),show_element) 

...

非常感谢

3 个答案:

答案 0 :(得分:2)

更改为:

template <typename T>
void show_element(T const &i) { std::cout << i << std::endl; }

for_each按顺序对取消引用[first,last]范围内的每个迭代器的结果应用给定函数(例如,show_element)。因此,您不需要获取容器的value_type。

同样在c ++ 14及以上版本中,您可以定义一个通用的lambda:

auto show_element = [](auto const &i) { std::cout << i << std::endl; };

并将其用作:

int arr[] = {1, 4, 66, 88, 9};
std::vector<int> data(arr, arr + sizeof(arr) / sizeof(int));
std::for_each(arr, arr + sizeof(arr) / sizeof(int), show_element);

LIVE DEMO

答案 1 :(得分:1)

使用类更灵活,而不是函数。在这种情况下,您可以将其他参数传递给功能对象。

例如,您可以指定要输出元素的流或用于分隔流中元素的分隔符。

该课程可以采用以下方式

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

template <typename T>
class show_elements
{
public:
    show_elements( const std::string &separator = " ", std::ostream &os = std::cout ) 
        : separator( separator ), os( os ) {}
    std::ostream & operator ()( const T &value ) const
    {
        return os << value << separator;
    }
protected:
    std::string separator;
    std::ostream &os;
};    

int main()
{
    int arr[] = { 1, 4, 66, 88, 9 };    
    std::vector<int> v( arr, arr + sizeof( arr ) / sizeof( *arr ) );

    std::for_each( v.begin(), v.end(), show_elements<int>() );
    std::cout << std::endl;
}

程序输出

1 4 66 88 9

答案 2 :(得分:0)

另一种简单的方法是使用基于范围的for循环。

for(auto& element : container) {
    cout<<element<<endl;
}